1

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

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

当我试图搜索短语“瓷砖墙浴室”时,理想情况下,第二个应该首先出现,因为那是完全匹配的,然后第一个会出现,因为所有 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"]
                    }

供参考,请查找附件图像。在此处输入图像描述

提前致谢!!!

4

2 回答 2

1

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

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

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

干杯,多米尼克

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

{
    "query": {
        "match": {
            "nickname": "tile wall bathroom"
        },
        "size": 10,
        "sort": ["_score", "nickname", "comments", "web_links", "document_name"]
    }
}
于 2017-07-07T14:38:32.033 回答
0

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

于 2021-07-30T16:15:19.100 回答