python - 列表中的 ElasticSearch 查询以包含 X 并包含 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"
}
}
}
}
]
}
}
}
推荐阅读
- javascript - 过滤数组内的数据并返回按组过滤的对象
- javascript - 赛普拉斯:如何在我的前端反应应用程序和不受我控制的第 3 方 API(服务器)之间执行测试?
- html - 为什么我看不到或单击我的导航栏按钮?
- cuda - NPP 图像互相关不产生有效结果
- .net - 通过 Azure AD 设置 Zendesk JWT
- c# - 在 TreeView 中移动节点时抑制 AfterSelect 事件
- drop-down-menu - 顶部菜单适用于标签。子菜单不适用于选项卡
- html - 如何像过渡一样在悬停后反转动画?
- php - WooCommerce 可变产品:使用不同价格的自定义文本显示最低价格
- python - Numpy:如何将元素映射到数组