word.go 2.0 KB

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