ElasticSearch混合查询类型

时间:2014-09-23 00:57:15

标签: node.js lucene elasticsearch

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

似乎无论如何我都不能在bool查询中使用match过滤器:

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

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

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

{
   "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查询之外时,似乎匹配查询有效,或者bool查询有效,但两者都没有。

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

我绝不是一名弹性搜索专家,当你在寻找更复杂查询的信息时,文档看起来很模糊。

如果有人可以举例说明如何以这种方式进行查询,我们将不胜感激。但是,请不要将我链接到Bool Queries或任何其他ElasticSearch文档的文档。我向你保证我已经彻底阅读了它们,并且我已经尝试了许多不同的方法来执行这个查询,但似乎都没有预期的行为。

我使用的是ElasticSearch 1.3.2

1 个答案:

答案 0 :(得分:2)

似乎无论如何我都不能在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"
      }]
    }
  }
}