我在弹性搜索中插入了如下数据。数据(名称列表)如下所示。
{
"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"
}
}
]
}
答案 0 :(得分:0)
我不确定您的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.*"}
}
]
}
}
}