首页 > 解决方案 > 带有过滤器的 Elasticsearch bool 查询不适用于带有“-”的字段

问题描述

每个客户的索引中有多个文档:

{"customer":"m-test-service", "customer_id":"x55sg" "book":"f","date"....}
{"customer":"m-test-service", "customer_id":"x55sg" "book":"g","date"....}
{"customer":"x12", "customer_id":"dhb5" "book":"e","date"....}
{"customer":"x12", "customer_id":"dhb5" "book":"d","date"....}

我想检索将 customer 和 customer_id 都设置为某些两个特定值的所有文档,例如以下 SQL 查询:SELECT * FROM TABLE WHERE CUSTOMER='XXX' AND CUSTOMER_ID="YYYY"

我一直在使用以下查询:

GET my_index/_search
{
  "query":{
    "bool":{
      "filter" : [
          {"term" : {"customer" : "x12"} },
          {"term" : {"customer_id" : "dhb5"}}
        ]
    
    }
  }
}

但是,当我尝试查询"-"其字符串中包含的客户时,我没有得到任何文档。我尝试使用以下值运行前面提到的查询:

"customer":"m-test-service", "customer_id":"x55sg"

我没有得到结果。

当我'-'从客户字段中删除字符时,我得到了包括 m-test-service 文档的结果。

为什么这个字符有问题?

标签: elasticsearch

解决方案


术语查询返回在提供的字段中包含确切术语的文档。

如果要搜索"customer":"m-test-service",请尝试使用customer.keyword字段。这使用关键字分析器而不是标准分析器

{
  "query":{
    "bool":{
      "filter" : [
          {"term" : {"customer.keyword" : "m-test-service"} },
          {"term" : {"customer_id" : "x55sg"}}
        ]
    
    }
  }
}

推荐阅读