如何在术语查询中模拟多个字段

gri*_*rdo 7 elasticsearch

我已经编写了一些代码(java / spring),该代码允许用户选择复选框,然后构建一个ElasticSearch查询。到目前为止,此方法一直运行良好,因为要求不同类别中的术语应为AND查询,因此可以遍历分层选择框以构建术语匹配(或查询),然后将它们组合并构建一个布尔词条查询

{
 "bool" : {
   "must" : [ {
     "terms" : {
       "field1" : [ "term1", "term2" ]
     }
   }, {
     "terms" : {
       "field2" : [ "term3" ]
     }
   } ]
 }
Run Code Online (Sandbox Code Playgroud)

提出了一些顶级框或查询的新要求,因此在这些情况下,我将需要一些类似于

{
 "query": {
   "bool" : {
     "must" : {
       "terms" : { "field1" : ["term1"] , "field1" : ["term2"] } 
    }
   }
 }
Run Code Online (Sandbox Code Playgroud)

}

我认为这是不可能的(elasticSearch 2.4.1),因为出现错误

"type": "query_parsing_exception",
"reason": "[terms] query does not support multiple fields",...
Run Code Online (Sandbox Code Playgroud)

我猜我应该将其移至过滤器查询,但我想知道是否有人可以确认这是最简单,最有效的更改(在此阶段,我正在寻找更改最少的路径)?

Vij*_*pta 6

试试这个:-

{
    "query": {
        "bool": {
            "must": [{
                    "term": {
                        "field1": "1"
                    }
                },
                {
                    "term": {
                        "field12": "1"
                    }
                }
            ]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Val*_*Val 6

解决方案是在第一个查询中简单地使用a should而不是a must

{
 "bool" : {
   "should" : [ {                    <---- change this
     "terms" : {
       "field1" : [ "term1", "term2" ]
     }
   }, {
     "terms" : {
       "field2" : [ "term3" ]
     }
   } ]
 }
Run Code Online (Sandbox Code Playgroud)

  • 为了其他用户的利益,难道不是很聪明的人拒绝了他们的护理,以解释对他不利的事情吗? (2认同)