使用弹性搜索查询查找多个精确值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用弹性搜索查询查找多个精确值相关的知识,希望对你有一定的参考价值。
我在弹性搜索中插入了一些如下所示的数据。数据(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.*"}
}
]
}
}
}
以上是关于使用弹性搜索查询查找多个精确值的主要内容,如果未能解决你的问题,请参考以下文章