如何在Elasticsearch上搜索带或不带撇号的单词?并处理拼写错误?

时间:2019-04-20 06:03:52

标签: elasticsearch

我正在尝试将全文搜索逻辑从MySQL转移到Elasticsearch。在MySQL中查找包含“ woman”一词的所有行,我只会写

SELECT b.code
FROM BIBLE b 
WHERE ((b.DISPLAY_NAME LIKE '%woman%')
 OR (b.BRAND LIKE '%woman%')
 OR (b.DESCRIPTION LIKE '%woman%'));

在elasticsearch上,我尝试过类似的事情

curl -X GET "localhost:9200/bible/_search" -H 'Content-Type: application/json' -d'
{
  "query": { "multi_match": { "query": "WOMAN","fields": ["description","display_name","brand"] } }, "sort": { "code": {"order": "asc" } },"_source":["code"]
}
'

但在进一步检查时没有相同的计数,我发现woman's之类的单词不是由Elasticsearch找到的,而是由MySQL找到的。我该如何解决?

AND

我如何合并诸如拼写错误或拼音错误的单词搜索之类的东西?

2 个答案:

答案 0 :(得分:0)

首先,您的映射怎么样?您在使用任何标记器吗?如果不是,我建议您如果要进行通配符搜索,则应使用 ngram 标记程序。它主要用于部分匹配。

https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html

答案 1 :(得分:0)

在elasticsearch中,必须在对数据建立索引之前对字段进行映射。映射是一种通知Elasticsearch以特定方式为数据建立索引的方式,以便按您想要的方式检索数据。

尝试以下DSL查询(JSON格式)以创建自定义分析器和映射:

PUT {YOUR_INDEX_NAME}
{
 "settings": {
   "analysis": {
    "analyzer": {
     "my_analyzer": {
       "tokenizer": "my_tokenizer"
     }
   },
   "tokenizer": {
     "my_tokenizer": {
       "type": "ngram",
       "min_gram": 3,
       "max_gram": 20,
       "token_chars": [
         "letter",
         "digit"
       ]
     }
   }
 },
 "max_ngram_diff": 20 //For Elasticsearch v6 and above
},
"mappings": {
 "properties": {
   "code": {"type": "long"},
   "description": {
     "type": "text",
     "analyzer": "my_analyzer"
   },
   "display_name": {
     "type": "text",
     "analyzer": "my_analyzer"
   },
   "brand": {
     "type": "text",
     "analyzer": "my_analyzer"
   }
  }
 }
}

示例查询示例:

GET {YOUR_INDEX_NAME}/_search
{
  "query": {
    "multi_match" : {
      "query" : "women",
      "fields" : [ "description^3", "display_name", "brand" ] 
    }
  }
}

我建议您看一下模糊查询中的拼写错误。

尝试使用Kibana UI通过DSL查询而不是cURL来测试索引,这将节省您的时间。

希望它对您有帮助。