python - 使用弹性搜索查询查找多个精确值
问题描述
我在弹性搜索中插入了一些如下数据。数据 (name_list) 如下所示。
{
"manage": {
"name_list": [
{
"name": "name1",
"name_gr": ["gr1","gr2"]
},
{
"name": "name2",
"name_gr": ["gr1","gr2"]
},
{
"name": "name3",
"name_gr": ["gr2","gr3"]
},
{
"name": "name4",
"name_gr": ["gr1","gr2","gr3","gr4"]
},
{
"name": "name4",
"name_gr": ["gr4","gr5"]
}
]
}
}
我正在尝试使用elasticsearch_dsl
python 模块编写弹性搜索查询Q
。
我获取与 name_gr regexp -> gr.* 匹配的名称的简单查询如下所示:
{"query":{"regexp":{"name_gr":"gr.*"}}}
查询以获取 name_gr 为“gr5”的名称如下所示:
{"query":{"regexp":{"name_gr":"gr5"}}}
现在,我的问题是:如果我想获取所有 name_gr 为“gr1”和“gr2”的名称,我的查询应该是什么?
例如:假设在这种情况下我的 name_gr 正则表达式将如下所示:
{"regexp":{"name_gr":"gr[12]"}}
现在,我的结果应该包含名称,name1, name2 and name4
因为名称也包含两者gr1 and gr2.
我不知道在这种情况下如何形成查询,我认为我将包含“必须”、“匹配”。但不知道如何形成它。
请帮忙。
PS:
{
"query": {
"bool": {
"must": [
{
"match": {
"name_gr": "gr1"
}
},
{
"match": {
"name_gr": "gr2"
}
}
]
}
}
}
此查询有效,但我的输入可以是正则表达式,例如:我的输入可以是
gr[12],所以我的查询应该是这样的(语法错误,有待修复):
{
"query": {
"bool": {
"must": [
{
"match": {
"regexp": {
"name_gr": "gr[12]"
}
}
}
]
}
}
}
因此,在此查询中,“匹配”部分应在内部解析为 ->
"must": [
{
"match": {
"name_gr": "gr1"
}
},
{
"match": {
"name_gr": "gr2"
}
}
]
}
解决方案
我不确定你的 name_gr 中有什么,我假设它只有一个值,它可能是任何值(例如:gr1、gr2、gr3...等)。
因此,在name_gr具有gr1或gr2的情况下:
{
"query": {
"bool": {
"should": [
{
"match": {
"name_gr": "gr1"
}
},
{
"match": {
"name_gr": "gr2"
}
}
]
}
}
}
如果 name_gr 是一个列表,那么您的查询将如下所示:
{
"query": {
"bool": {
"must": [
{
"regexp":{"name_gr":"gr.*"}
},
{
"regexp":{"name_gr":"gr.*"}
}
]
}
}
}
推荐阅读
- node.js - Azure > 应用程序设置 > 应用程序设置不设置 process.env.My_Custom_Variable
- angular - Angular Material 自定义主题使弹出窗口透明
- python - 从列表中聚合多行 - Python
- python - 使用 Azure-Cli 创建新容器
- perl - 在 perl 中用 grep 替换 foreach
- regex - 从字符串中删除长主题标签跟踪
- java - 如何使用 ojdbc 12.1.0.2 驱动程序从 java 将数组传递给 oracle 存储过程?
- gremlin - 在 TinkerPop3 Gremlin 查询和 JanusGraph 中获取数组的第一项作为对象
- c# - 将列表从一个类转换为另一个类
- sql - 从与另一列的最大值关联的列中返回一个值