【问题标题】:Elastic Search sorting and rankingElastic Search 排序和排名
【发布时间】:2021-07-31 00:15:19
【问题描述】:

我正在使用弹性搜索2.x 版。我有两条记录,它们的索引为:

  1. 浴室墙砖(作为“昵称”索引文档列)
  2. 瓷砖墙浴室(作为“昵称”索引文档列)

当我尝试搜索短语“tile wall bath”时,理想情况下,第二个应该首先出现,因为那是完全匹配,然后第一个会出现,因为所有 3 个单词都匹配(瓷砖、墙壁和浴室)。

我根据列在查询中进行排序。以下是我的弹性搜索查询:

{
                          "query" : {
                                "filtered" : {
                                      "query" : {
                                            "query_string": {
                                                "query": "*tile wall bathroom*",
                                                "fields": [
                                                    "nickname",
                                                    "comments",
                                                    "category_name",
                                                    "subcategory_name",
                                                    "document_name",
                                                    "web_links",
                                                    "document_extension",
                                                    "property_name",
                                                    "document_content"
                                                ],                                                    
                                                "analyze_wildcard": true
                                            }
                                      },
                                      "filter" : { 
                                            "and" : [
                                                  {"term" : {"property_id" : "6"}}
                                            ]
                                      }
                                }
                          },
                          "size": 10,
                          "sort": ["nickname", "comments", "web_links", "document_name"]
                    }

参考图片见附件

提前致谢!!!

【问题讨论】:

    标签: elasticsearch elasticsearch-query


    【解决方案1】:

    所有 3 个术语都命中,因为两个文档字段都包含“浴室”、“瓷砖”和“墙壁”。因此,将两个文档都检索为命中是很常见的。正如您所建议的,通常按分数排序时,第一个文档的排名应高于第二个文档。

    由于您的第一个排序字段是“昵称”字段,因此您会得到这个结果集,其中首先所有文档按其“昵称”字段的字母顺序排序(“浴室”中的 b墙砖”出现在 t “瓷砖墙浴室”等之前)。 这不包括按搜索请求的相关性分数排序。您可以使用“昵称”作为辅助排序参数,而使用“_score”字段作为第一个。

    您也可以使用 Elasticsearch-explain 功能检查您的查询。

    干杯,多米尼克

    编辑:请尝试针对 Elasticsearch-Explain-API 运行您的查询,这样可以了解您的结果是如何计算的。此外,您可以对您的数据运行匹配查询,以查看您的结果是否比“query_string”的使用有所改善。因此,您也可以省略排序参数,仅按相关性分数对结果进行排名。

    {
        "query": {
            "match": {
                "nickname": "tile wall bathroom"
            },
            "size": 10,
            "sort": ["_score", "nickname", "comments", "web_links", "document_name"]
        }
    }
    

    【讨论】:

    • 谢谢多米尼克。你能否给我写信询问你的解释。我尝试将“_scrore”字段放在首位,但显示的结果相同。
    • 感谢 Chocomesli。但是这个查询根本不起作用。
    • 您尝试过 Explain-API 吗?
    • 你对分词器有什么想法吗?
    • 请分享您对使用 Explain-API 的见解,因为这解释了您的结果排名是如何计算的。此外,您可以在没有任何排序参数的情况下使用此查询,也可以使用“昵称”作为唯一搜索字段进行一次查询。
    【解决方案2】:

    您应该使用shingles。您的用例是专门为它们设计的。

    【讨论】:

      猜你喜欢
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多