【问题标题】:ElasticSearch - Search keyword across all fields and pair down results using filtersElasticSearch - 在所有字段中搜索关键字并使用过滤器配对结果
【发布时间】:2017-09-29 22:39:19
【问题描述】:

这个问题的目的是解决在我的前端实现分面导航的问题。我的 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”组的 geoLocations 过滤掉这些。

所以我想要文档中某处带有“thomson”的文档,其地理位置为美国或英国,并且属于 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
              }
            }
          }
        }
      }
    }
  }
}

【问题讨论】:

  • 不确定为什么不将两个 should 子句都移到 must 子句中?
  • 我将查询更新为以下内容,但它似乎没有给我任何点击:{“query”:{“bool”:{“must”:[{“multi_match”:{“查询”:“汤姆森”,“字段”:[“*”]}},{“术语”:{“地理位置”:[“美国”,“英格兰”]}},{“术语”:{“组” : ["AA", "BB"] } } ] } } }
  • 能否也分享一下你索引的映射?我怀疑你的 geographicLocationGroup 字段是分析字符串

标签: elasticsearch


【解决方案1】:

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

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

【讨论】:

  • 谢谢瓦尔。不幸的是,我收到了“parse_exception”错误。给出的原因:“无法解析格式为 [strict_date_optional_time||epoch_millis] 的日期字段 [thomson]”。这可能是因为星搜索搜索格式为字符串以外的字段吗?在进行常规搜索时,搜索“_all”似乎有效。
  • 我已经更新了查询,你现在得到了什么?另请参阅我对您的问题的第二条评论。
  • 用我的映射编辑了我原来的问题。更新后的查询不再抛出异常,但实际上没有得到任何命中。
  • 我已经更新了我的查询,您只需使用 .keyword 子字段就可以了。
  • 是的,成功了!如果我以小写字母搜索术语,它也可以工作。我相信映射应该将分析器选项设置为不分析。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2021-11-05
  • 2020-01-28
  • 2018-05-15
  • 1970-01-01
  • 2012-02-24
  • 2012-08-30
  • 2021-10-15
  • 2017-03-13
相关资源
最近更新 更多