[英]ElasticSearch query from list to contain X and contain something other than X
假设在我的Elasticsearch中,我有一个“ ListNames”字段,该字段提供字典列表。 每个词典中的键之一是“人物”。 我的目标是从ES查询/过滤所有相关的配置文件,其中“ ListNames.People”包含“ Adam”,并且包含一个非“ Adam”的名称。 没有所有可能名称的详细列表(由于名称太多),我如何实现? 感谢您的任何帮助。
下面的代码显示了我尝试过的帖子的示例
#Note: this returns profiles with ONLY Adam contained in the ListNames.
post_data = {
"size": 30,
"query": {
'match':{
'ListNames.People':'Adam'
}
}
}
#################
post_data = {
"size": 30,
"query": {
'bool': {
'should': [{
'match': {
'ListNames.People': 'Adam'
}
}],
'must_not':[
{'match':{'ListNames.People':'Adam'}}
]
}
}
}
###################
post_data = {
"size": 30,
"query": {
'bool': {
'must': [{
'match': {
'ListNames.People': 'Adam'
}
}],
'must_not':[
{'match':{'ListNames.People':'Adam'}}
]
}
}
}
第一个帖子返回仅包含不希望的Adam的结果,其他两个帖子返回空。
评论后讨论后更新
您必须毫不费力地检查这种状况。 请注意,使用脚本可能会降低性能。
查询将是:
{
"query": {
"bool": {
"filter": [
{
"term": {
"ListNames.People": "Adam"
}
},
{
"script": {
"script": {
"source": "for(int i = 0; i < doc['ListNames.People'].length; i++) { if(doc['ListNames.People'][i] != params.person) { return true; }} return false;",
"lang": "painless",
"params": {
"person": "Adam"
}
}
}
}
]
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.