如何在Elasticsearch上搜索带或不带撇号的单词?并处理拼写错误?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在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%'));
对弹性搜索,我尝试过类似的东西
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发现的。我该如何解决这个问题?
和
如果拼写错误或在语音上相同的单词,我如何合并搜索单词之类的内容?
首先,您的映射如何?你在使用任何标记器吗?如果不是我会建议如果你想做通配符搜索,你应该使用ngram tokenizer。它主要用于部分匹配。
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html
在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,这将节省您的时间。
希望它能帮到你。
以上是关于如何在Elasticsearch上搜索带或不带撇号的单词?并处理拼写错误?的主要内容,如果未能解决你的问题,请参考以下文章
sh 使用CentOS 6和7上的Cerebro UI安装ElasticSearch(带或不带cPanel)
-XX:MaxPermSize 带或不带 -XX:PermSize
是否有任何可行的算法来计算所有 iOS 设备(带或不带 M7 芯片)上的步数?