弹性搜索 - 搜索词形成一个没有空格的单词

时间:2021-05-04 11:50:42

标签: elasticsearch

我有一个名为 products 的索引,使用默认索引设置。它有一个 text 类型的名称字段,因此它存储的名称如下所示,

  1. 哑光口红
  2. 润唇膏

现在,当用户搜索唇膏时会出现问题,它先获取润唇膏,然后获取唇膏哑光。
我希望先得到 Lipstick 的搜索结果。

感谢任何帮助,谢谢!

2 个答案:

答案 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*"