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

问题描述 投票:0回答:2

我正在尝试将我的全文搜索逻辑从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%'));

对弹性搜索,我尝试过类似的东西

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发现的。我该如何解决这个问题?

如果拼写错误或在语音上相同的单词,我如何合并搜索单词之类的内容?

elasticsearch
2个回答
0
投票

首先,您的映射如何?你在使用任何标记器吗?如果不是我会建议如果你想做通配符搜索,你应该使用ngram tokenizer。它主要用于部分匹配。

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


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,这将节省您的时间。

希望它能帮到你。

© www.soinside.com 2019 - 2024. All rights reserved.