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

标签 elasticsearch

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

例如,如果用户搜索关键字“汤姆森”,则应在所有字段中进行搜索。然后,将向用户显示两个(或更多)表示过滤器的复选框(例如,“地理位置”和“组”)-这应该是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' }

首先,我应该只在字段中某处出现“汤姆森”的结果(例如,上面的前两个文档)。然后,应使用“USA”或“ENGLAND”的地理位置以及“AA”或“BB”的组来过滤掉这些位置。

因此,我希望文档中某处带有“汤姆森”字样的文档具有美国或英国的地理位置,并且位于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
              }
            }
          }
        }
      }
    }
  }
}

最佳答案

只需将两个must子句移到must子句中

{
   "query":{
      "bool":{
        "must": ,
         "must":[
            {
                "multi_match": {
                    "query": "thomson",
                    "fields": ["name", "street"]
                }
            },
            {
               "terms":{
                  "geographicLocation.keyword": ["USA", "ENGLAND"]
               }
            },
            {
               "terms":{
                  "Group.keyword": ["AA", "BB"]
               }
            }
         ]
      }
   }
}

关于elasticsearch - ElasticSearch-在所有字段中搜索关键字,并使用过滤器将结果配对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46490634/

相关文章:

ruby-on-rails - 使用ElasticSearch的多术语嵌套文档查询

ruby-on-rails - 在digitalocean上运行elasticsearch

elasticsearch - 从Xpath创建嵌套字段并检查现有文档

elasticsearch 对唯一术语与 ngram 术语进行评分

elasticsearch - 如何获取Elastic中每次出现的文档数?

elasticsearch - 内联脚本错误

elasticsearch - 如何对高级查询使用 Elasticsearch :

Elasticsearch REST API : search by particular field only

elasticsearch - 如何匹配多个术语查询?

elasticsearch - Elasticsearch -查询仅搜索5个字符