elasticsearch - 如何使用 AND 条件编写 ElasticSearch 查询
问题描述
我正在尝试编写一个弹性搜索查询来搜索具有两个条件的数据,如下所示
{
"query": {
"match": {
"trackingId": "track4324234234244",
"log_message": "downstream request-response"
}
}
}
上述查询不起作用,因为 [match] 查询不支持多个字段。有没有办法我可以做到这一点。
解决方案
您可以使用Bool query,其中可以使用must
子句。
must
表示:子句(查询)必须出现在匹配的文档中。这些子句必须匹配,例如逻辑 AND。
要了解 must 和 should 之间的区别,请参考这个SO answer
添加带有示例文档和搜索查询的工作示例
索引样本数据:
{
"trackingId":"track4324234234244",
"log_message":"downstream request-response"
}
{
"trackingId":"track4324234234244",
"log_message":"downstream"
}
{
"trackingId":"tracks4324234234244",
"log_message":"downstream request-response"
}
搜索查询:
{
"query": {
"bool": {
"must": [
{
"match": {
"trackingId": "track4324234234244"
}
},
{
"match": {
"log_message": {
"query": "downstream request-response",
"operator": "and"
}
}
}
]
}
}
}
搜索结果:
"hits": [
{
"_index": "my_index",
"_type": "_doc",
"_id": "1",
"_score": 1.8570712,
"_source": {
"trackingId": "track4324234234244",
"log_message": "downstream request-response"
}
}
]
推荐阅读
- arrays - 大会 x86 - 比较数组值需要帮助(冒泡排序)
- linux - 如何使用find重命名不同目录中具有相同名称的文件
- php - 如何使用php函数上传图片
- ipv6 - 在 contiki 中将 ipv6 转换为 ipv4
- c++ - 为什么 KCacheGrind 不显示我的函数名称?
- python - 使用大于或小于时如何执行while循环
- c# - 在 C# 控制台应用程序中删除控制台键入的文本
- python - 有没有办法处理 Window 的命令行错误?
- proftpd - 如何在 ProFTPD 上实现没有表的静态/固定 SQLGroupInfo?
- javascript - 在异步调用和共享变量之间