我有一个名为 products 的索引,使用默认索引设置。它有一个 text 类型的名称字段,因此它存储的名称如下所示,
现在,当用户搜索唇膏时会出现问题,它先获取润唇膏,然后获取唇膏哑光。
我希望先得到 Lipstick 的搜索结果。
感谢任何帮助,谢谢!
答案 0 :(得分:0)
首先要获得理想的结果,您需要正确的相关性。
您可以通过向查询添加 boost 来改进查询。我猜您在这里执行 match query 以获得结果。您也可以尝试使用 match phrase query 并将 slop 设置为 2。
这是一篇博客,其中解释了如何改进 relevancy。
答案 1 :(得分:0)
根据搜索用例,您需要使用分析器来决定如何在弹性搜索中索引数据。此 elastic search analyzer blog 可以帮助您开始学习基础知识。可以查看有关分析器的更多详细信息here。
理解这一点很重要,因为任何快速或直接的解决方案都只会暂时解决单个用例,但不会长期有效。
我在我的机器上播放了您的输入,如果您想在这方面不受阻止,请使用以下查询:
GET mstemp/test/_search
{
"query": {
"bool": {
"should": [
{
"query_string": {
"default_field": "field",
"query": "Lipstick",
"boost": 2
}
},
{
"query_string": {
"default_field": "field",
"query": "Lip stick"
}
}
]
}
}
}
在这里,我在删除空格后使用用户输入进行搜索,并提升其结果,使其排在首位。
输出:
"hits": [
{
"_index": "mstemp",
"_type": "test",
"_id": "AXk3SB3tNamWTgl09SXK",
"_score": 0.51623213,
"_source": {
"field": "Lipstick matte"
}
},
{
"_index": "mstemp",
"_type": "test",
"_id": "AXk3SkoXLqUWVnBbDm5a",
"_score": 0.25811607,
"_source": {
"field": "Lip balm"
}
}
]
可以通过在查询的开头和/或结尾添加 *
来完成部分搜索,例如"query": "*Lipstick*"