ElasticSearch - 在所有字段中搜索关键字,并使用过滤器对结果进行配对

时间:2017-09-29 14:10:35

标签: elasticsearch

这个问题的目标是解决在前端实现分面导航的问题。我的UI中有一个输入字段,允许用户查询所有字段/所有索引中的任何字词(全文)。我还希望用户能够使用分面导航(例如,过滤器)将结果配对。

例如,如果用户搜索关键字“thomson”,则应搜索所有字段。然后,将向用户呈现表示过滤器的两个(或更多)复选框(假设为“地理位置”和“组”) - 这应该是AND过滤器。我尝试了以下ElasticSearch查询无济于事。

{
   "query":{
      "bool":{
        "must": {
            "multi_match": {
                "query": "thomson",
                "fields": ["*"]
            }
        },
         "should":[
            {
               "terms":{
                  "geographicLocation": ["USA", "ENGLAND"]
               }
            },
            {
               "terms":{
                  "Group": ["AA", "BB"]
               }
            }
         ]
      }
   }
}

因此,假设我在ES中有以下文件:

{ name: 'Joe', street: '3 thomson st', geographicLocation: 'USA', Group: 'AA' }
{ name: 'Thomson': street: '1 york ave', geographicLocation: 'CHINA', Group: 'BB' }
{ name: 'Jane', street: '2 jones dr' geographicLocation: 'ENGLAND', Group: 'CC' }

首先,我应该只在字段中的某处获得'thomson'的结果(例如,上面的前两个文档)。然后,那些应该被“USA”或“ENGLAND”的地理位置和“AA”或“BB”的组过滤掉。

所以我想在文档中的某个地方使用'thomson'的文档,其地理位置为USA或ENGLAND,并且在AA组或BB组中。这让我只有第一份文件。

我有一个不可能的时间管理上面的ES参数,以使其工作。

编辑:这是我的映射:

{
  "person": {
    "mappings": {
      "TEST": {
        "properties": {
          "name": {
            "type": "text"
          },
          "street": {
            "type": "text"
          },
          "EndDate": {
            "type": "long"
          },
          "EndDt": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "Group": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "d3232b0e1b28bfb8b432a3459404676d:created_date": {
            "type": "date"
          },
          "d3232b0e1b28bfb8b432a3459404676d:edited": {
            "type": "date"
          },
          "geographicRegion": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

只需在must子句

中移动两个should子句
{
   "query":{
      "bool":{
        "must": ,
         "must":[
            {
                "multi_match": {
                    "query": "thomson",
                    "fields": ["name", "street"]
                }
            },
            {
               "terms":{
                  "geographicLocation.keyword": ["USA", "ENGLAND"]
               }
            },
            {
               "terms":{
                  "Group.keyword": ["AA", "BB"]
               }
            }
         ]
      }
   }
}