word.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package util
  2. import (
  3. "encoding/json"
  4. "log"
  5. "strings"
  6. "unicode/utf8"
  7. )
  8. func dealWithScoreRules(name string,estype string,esindex string) (string,bool) {
  9. new_name,isok :="",false
  10. query:= `{"query":{"bool":{"must":[{"query_string":{"default_field":"azktest.name_2","query":"`+name+`"}}],"must_not":[],"should":[]}},"from":0,"size":1,"sort":[],"facets":{}}`
  11. //默认取最高分-分析多个分-遍历器查询
  12. tmp := make(map[string]interface{})
  13. json.Unmarshal([]byte(query),&tmp)
  14. searchResult, err := Client_Es.Search().Index(esindex).Type(estype).Source(tmp).Do()
  15. if err != nil {
  16. log.Println("从ES查询出错", err.Error())
  17. return new_name,isok
  18. }
  19. data := make(map[string]interface{},0)
  20. if searchResult.Hits != nil {
  21. for _, hit := range searchResult.Hits.Hits {
  22. json.Unmarshal(*hit.Source, &data)
  23. }
  24. }
  25. if len(data)>0 && data != nil {
  26. new_name = objToString(data["name"])
  27. }
  28. if new_name!="" { //分析hit比例
  29. total,hit := dealWithWordsRules(name,new_name)
  30. if float64(hit)/float64(total)>=0.8 {
  31. isok = true
  32. }
  33. }
  34. return new_name,isok
  35. }
  36. //击中数量以及比例
  37. func dealWithWordsRules(info_name string ,source_name string) (int,int){
  38. total,hit :=0,0
  39. nameArr,_ := calculateWordCount(info_name)
  40. _,total = calculateWordCount(source_name)
  41. for _,v1 := range nameArr {
  42. if strings.Contains(source_name,v1) {
  43. hit++
  44. }
  45. }
  46. return total,hit
  47. }
  48. //分词结果
  49. func calculateWordCount(name string) ([]string,int) {
  50. arr, space := make([]string, 0), 2
  51. total := utf8.RuneCountInString(name) - (space - 1)
  52. if name == "" || total <= 0 {
  53. return arr, 0
  54. }
  55. nameRune := []rune(name)
  56. for i := 0; i < total; i++ {
  57. new_str := string(nameRune[i : space+i])
  58. arr = append(arr, new_str)
  59. }
  60. return arr, len(arr)
  61. }
  62. func objToString(old interface{}) string {
  63. if nil == old {
  64. return ""
  65. } else {
  66. r, _ := old.(string)
  67. return r
  68. }
  69. }