elasticsearch - 带有过滤器的 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 文档的结果。
为什么这个字符有问题?
解决方案
术语查询返回在提供的字段中包含确切术语的文档。
如果要搜索"customer":"m-test-service"
,请尝试使用customer.keyword
字段。这使用关键字分析器而不是标准分析器
{
"query":{
"bool":{
"filter" : [
{"term" : {"customer.keyword" : "m-test-service"} },
{"term" : {"customer_id" : "x55sg"}}
]
}
}
}
推荐阅读
- c# - Unity、Dll 上的 WebServices,与 .Net 4.0 的兼容性
- php - 在选择查询php mysql中选择查询
- import - 导入是否必须在程序的开头
- maven - 如何禁止发布:从多模块 maven 项目的子模块执行?
- sql - 在条件下获取两个表中的重合行和非重合行
- javascript - IOS:当我点击推送通知时,如何打开 Ionic 应用程序的特定页面?
- docker-compose - 使用 Docker Compose 为 Omnisus Gitlab 的自定义 HTTPS 端口重定向 HTTP 到 HTTPS
- laravel - Laravel 使用 .htaccess 重定向到 HTTPS
- ruby - Ruby 数据格式化
- azure - 在 Azure 数据工厂 V2 中使用参数代替链接服务名称