JD3*_*333 6 javascript search fuzzy-search node.js elasticsearch
我在 ElasticSearch 中使用模糊搜索选项。它太酷了。
但是我在搜索有空格的值时遇到了一个问题。例如说我有两个值:
"Pizza"
"Pineapple Pizza"
Run Code Online (Sandbox Code Playgroud)
我使用以下查询搜索 Pizza:
client.search({
index: 'food_index',
body: {
query: {
fuzzy: {
name: {
value: "Pizza",
transpositions: true,
}
},
}
}
})
Run Code Online (Sandbox Code Playgroud)
返回的值是:
"Pizza"
"Pineapple Pizza"
Run Code Online (Sandbox Code Playgroud)
这是预期的。但是,如果我在查询中输入值“Pineapple Pizza”:
client.search({
index: 'food_index',
body: {
query: {
fuzzy: {
name: {
value: "Pineapple Pizza",
transpositions: true,
}
},
}
}
})
Run Code Online (Sandbox Code Playgroud)
返回的值是:
""
Run Code Online (Sandbox Code Playgroud)
空的
这是为什么?它应该是完全匹配的。我正在考虑将所有包含空格的名称切换为下划线。所以“Pineapple Pizza”将是“Pineapple_Pizza”(这个解决方案对我有用)。但我问这个问题是希望找到更好的选择。我在这里做错了什么?
模糊查询是术语级别的查询。这意味着在匹配文档之前不会分析搜索的文本。在您的情况下,标准分析器用于字段名称,它将“菠萝比萨”拆分为两个标记菠萝和比萨。模糊查询试图将搜索文本“菠萝比萨”与索引中的任何相似词匹配,并且索引中没有整个词菠萝比萨的条目(它被分成两个词。)
您需要使用带有模糊设置的匹配查询来分析查询字符串
{
"query": {
"match" : {
"item" : {
"query" : "Pineappl piz",
"fuzziness": "auto"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
回复 :
[
{
"_index" : "index27",
"_type" : "_doc",
"_id" : "p9qQDG4BLLIhDvFGnTMX",
"_score" : 0.53372335,
"_source" : {
"item" : "Pineapple Pizza"
}
}
]
Run Code Online (Sandbox Code Playgroud)
您还可以在将整个文本存储在索引中的关键字字段上使用模糊性
{
"query": {
"fuzzy": {
"item.keyword": {
"value":"Pineapple pizz"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑1:
{
"query": {
"match" : {
"item" : {
"query" : "Pineapple pizza",
"operator": "and",
"fuzziness": "auto"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
"operator": "and" --> 查询中的所有标记必须存在于文档中。默认为 OR ,如果存在任何一个令牌,则存在文档。还有其他可能的组合,您可以在其中定义应以百分比形式匹配的标记数
| 归档时间: |
|
| 查看次数: |
2137 次 |
| 最近记录: |