我正在尝试将全文搜索逻辑从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
我如何合并诸如拼写错误或拼音错误的单词搜索之类的东西?
答案 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来测试索引,这将节省您的时间。
希望它对您有帮助。