【问题标题】:Elastic search `filter` query not working弹性搜索“过滤器”查询不起作用
【发布时间】:2019-12-17 17:56:03
【问题描述】:

我一直在尝试找出与查询“abc”匹配的条目,并且从 multi_match 返回的所有条目中,我需要根据包含给定 business_id 的条目过滤条目,其中 business_id 是字段之一。

我已尝试使用以下查询,但搜索未返回任何记录,即使有一条记录同时满足必须和过滤查询。 问题出在过滤器查询中,因为当我评论时它得到了 multi_match 根据需要返回的 2 条记录,现在我想根据 business_id 过滤这些记录,所以最终应该只得到一条记录,但过滤器查询不起作用。

GET customer/_search
{
              "query": {
                  "bool": {
                      "must": {
                          "dis_max": {
                              "queries":
                                  {
                                      "multi_match": {
                                          "query": "abc",
                                          "type": "phrase_prefix",
                                          "fields": ["first_name", "last_name", "email", "city", "state", "zip", "country"]
                                      }
                                  }
                          }
                      },
                      "filter": {
                          "term": {
                              "business_id": business_id
                          }
                      }
                  }
              }
          }

Here is how my records in index looks like

【问题讨论】:

  • 我相信这也应该按照您的意愿工作。您是否尝试取消注释必须或过滤器部分以查看查询的哪一部分是您的问题?另外,您的索引看起来如何?例如,phrase_prefix 不适用于关键字。
  • 您好,感谢您的调查。问题出在过滤器查询中,因为当我评论时它得到了 multi_match 根据需要返回的 2 条记录,现在我想根据 business_id 过滤这些记录,所以最终应该只得到一条记录,但过滤器查询不起作用。另外,尝试删除phrase_prefix,但没有得到所需的结果
  • 在不知道您的索引是什么样子的情况下很难提供更多信息。您能否提供映射的相关部分,或者您想要匹配的文档?
  • 嘿,我已经添加了有问题的索引结构的图像。

标签: node.js reactjs elasticsearch


【解决方案1】:

为了对此进行调试,我建议您只使用查询中的 must 部分进行搜索,并查看是否获得了预期的结果,然后仅使用 filter 部分进行相同的操作。

您希望看到的是,在这两个查询中,您都会得到您期望的文档。我相信其中一个不应返回您期望的文档,然后您可以尝试了解原因(并在需要时更新问题)。

如果mustfilter 都返回您期望的文档,那么上面的查询应该可以正常工作。另外,如果这不起作用,请添加您希望收到的文档

【讨论】:

  • Hey Ziv,我已经修改了问题。如果您有解决方案,请检查并告诉我
  • 我建议您首先删除dis_max 查询并将multi_match 直接放在must 部分下。
  • 但是must 部分工作正常。错误出现在filter 部分,我找不到。所以,为什么要在dis_maxmulti_match 按要求工作时删除它们。
【解决方案2】:
GET customer/_search
{
              "query": {
                  "bool": {
                      "must": {
                          "dis_max": {
                              "queries":
                                  {
                                      "multi_match": {
                                          "query": "abc",
                                          "type": "phrase_prefix",
                                          "fields": ["first_name", "last_name", "email", "city", "state", "zip", "country"]
                                      }
                                  }
                          }
                      },
                      "filter": {
                          "match": {
                              "business_id": business_id
                          }
                      }
                  }
              }
          }

我的问题的解决方案。现在过滤器查询工作正常,因为我已将 term 替换为 match

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-25
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多