繁体   English   中英

列表中的ElasticSearch查询包含X并包含X以外的其他内容

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM