我试图从具有list属性的对象进行搜索。 我需要能够选择包含所有子列表项的所有对象。
ex: 如果我的对象有[A,B,C],则应该为给定的查询返回它: [A],[A,B],[A,B,C],[A,C],[C,A] ......(输入顺序不必匹配)
但如果子列表包含任何不属于对象列表的元素,则不应返回该元素。
ex: [D],[A,D] ...... 这些查询不应该有效。
我已经设法为现有子列表的查询执行此操作,但是当子列表中的任何项目不存在时都没有。
有什么想法吗?
谢谢!
答案 0 :(得分:0)
使用逗号分隔子列表查询项作为匹配查询的值,并将运算符值设置为“和”,如下所示:
文件样本:
{
"Id": 1,
"Name": "One",
"tags": ["A","B","C"]
}
对于子列表:[A,B]:
{
"query": {
"match": {
"tags": {
"query": "A,B",
"operator": "and"
}
}
}
}
我在ElasticSearch 5.6.0和6.1.2中测试
答案 1 :(得分:0)
假设A
,B
,C
等被映射为keyword
types,多个bool
查询filter
条款将是单向< / p>
var response = client.Search<User>(s => s
.Query(q => +q
.Term(f => f.Badges, "A") && +q
.Term(f => f.Badges, "B") && +q
.Term(f => f.Badges, "C")
)
);
生成以下查询
{
"query": {
"bool": {
"filter": [
{
"term": {
"badges": {
"value": "A"
}
}
},
{
"term": {
"badges": {
"value": "B"
}
}
},
{
"term": {
"badges": {
"value": "C"
}
}
}
]
}
}
}
用户文档需要至少所有A
,B
和C
徽章才能被视为匹配。
除了A
,B
和C
之外,用户文档还可能包含其他徽章;如果您需要查找完全 A
,B
和C
的文档,请使用{{1}查看terms_set
query } value设置为传递的术语数。