【问题标题】:ElasticSearch mixing query typesElasticSearch 混合查询类型
【发布时间】:2014-09-23 00:57:14
【问题描述】:

我很难让这个 elasticsearch 查询合作。我目前正在尝试使用 Bool 查询来获取精确搜索和分析/全文搜索的结果。

似乎我无法在布尔查询中使用match 过滤器:

{
   "bool":{
      "should":[
         "match":{"mainInfo.states": "Wisconsin"},
         "match":{"mainInfo.cities": "WI"}
      ]
   }
}

这会引发解析器错误,告诉我匹配不是查询类型。

我需要能够在也具有术语过滤器的布尔查询中进行全文搜索。所以基本上我想有一个有点像这样的查询:

{
   "bool":{
      "must":[
         "term":{"mainInfo.clientId":"123456"}
      ],
      "should":[
         "match":{"mainInfo.states": "Wisconsin"},
         "match":{"mainInfo.cities": "WI"}
      ]
   }
}

我可以有 1 或 2 个必须存在的术语,以及几个全文搜索,其中 2 个应该存在。

我还使用 function_score 查询以使用 random_seed 返回随机、可分页的结果。

我的问题是我无法在我的 bool 查询中运行全文查询。似乎只有term 过滤器有效。此外,当我将 match 查询从 bool 查询中取出时,似乎 match 查询有效,或者 bool 查询有效,但绝不会两者兼而有之。

我似乎无法形成一个匹配多个term 查询和多个匹配查询的查询。 term 必须存在,而match 应该存在(因此至少匹配其中一个过滤器)。

我绝不是弹性搜索专家,当您查找有关更复杂查询的信息时,文档似乎很模糊。

如果有人可以提供如何以这种方式查询的示例,将不胜感激。但是,请不要只将我链接到 Bool Queries 的文档或任何其他 ElasticSearch 文档。我向您保证,我已通读它们,并且尝试了多种不同的方法来执行此查询,但似乎都没有预期的行为。

我正在使用 ElasticSearch 1.3.2

【问题讨论】:

    标签: node.js lucene elasticsearch


    【解决方案1】:

    我似乎无法在 bool 查询中使用匹配过滤器:

    您的查询语法不正确,如果您有多个子句,则每个子句都应包含在自己的对象中:

    {
      "query":{
        "custom_filters_score":{
          "query":{
            "nested":{
              "path":"mainInfo",
              "query":{
                "bool":{
                  "should":[
                    {
                      "match":{
                        "mainInfo.states":"WI"
                      }
                    },
                    {
                      "match":{
                        "mainInfo.cities":"Wisconsin"
                      }
                    }
                  ]
                }
              }
            }
          },
          "filters":[{
            "term":{
              "mainInfo.clientId":"123456"
            },
            "script":"yourscriptgoeshere"
          }]
        }
      }
    }
    

    【讨论】:

    • 似乎我只收到了clientId,或者这些中的哪一个出现在对象中。我似乎得到了术语或匹配查询的结果,但从来没有两者兼而有之。我觉得这是使用“function_score”查询的结果
    • 您能发布一个映射示例吗?
    • 你在使用嵌套类型吗?
    • 映射很大,clientId 没有被分析,因为它不需要。城市和州被分析。是的,我正在使用嵌套类型,但是从最近版本的 ElasticSearch 中引用具有 parent.child 等格式的嵌套类型应该可以正常工作,而且确实可以。但是,当我使用上面的示例进行 function_score 查询时,我只得到给定 clientId 的结果,而不是提供的州或城市。我正在使用 function_score 查询而不是过滤查询。过滤后的查询工作得很好。
    • 如果您有 nested 类型,则需要使用 nested 查询。假设mainInfonested,我已经更新了我的答案。欲了解更多信息,请查看:elasticsearch.org/guide/en/elasticsearch/reference/current/…
    猜你喜欢
    • 1970-01-01
    • 2018-02-07
    • 2021-05-24
    • 2021-04-17
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 2021-12-15
    • 2016-10-27
    相关资源
    最近更新 更多