[英]How to query for two fields in one and the same tuple in an array in ElasticSearch?
假設我的索引中有一些文檔如下所示:
{
"category":"2020",
"properties":[
{
"name":"foo",
"value":"2"
},
{
"name":"boo",
"value":"2"
}
]
},
{
"category":"2020",
"properties":[
{
"name":"foo",
"value":"8"
},
{
"name":"boo",
"value":"2"
}
]
}
我想以只返回那些匹配"foo":"2"
而不是"boo":"2"
文檔的方式查詢索引。
我試圖編寫一個同時匹配properties.name
和 properties.value
的查詢,但是隨后我得到了誤報。 我需要一種方法來告訴ElasticSearch名稱和值必須是相同屬性元組的一部分。
我怎樣才能做到這一點?
您需要將properties
映射為nested
類型 。 因此,您的映射將類似於以下內容:
{
"your_type": {
"properties": {
"category": {
"type": "string"
},
"properties": {
"type": "nested",
"properties": {
"name": {
"type": "string"
},
"value": {
"type": "string"
}
}
}
}
}
}
然后,您的查詢要匹配在同一元組中具有"foo=2"
但在同一元組中沒有"boo=2"
文檔,則需要相應地使用nested
查詢 ,例如以下查詢 。
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "properties",
"query": {
"bool": {
"must": [
{
"match": {
"properties.name": "foo"
}
},
{
"match": {
"properties.value": "2"
}
}
]
}
}
}
}
],
"must_not": [
{
"nested": {
"path": "properties",
"query": {
"bool": {
"must": [
{
"match": {
"properties.name": "boo"
}
},
{
"match": {
"properties.value": "2"
}
}
]
}
}
}
}
]
}
}
}
@Val的答案是最好的。 不過,我要添加一件事,因為它使一種查詢類型與其他可能受益於nested
的“相反”功能的查詢有所不同。
在Elasticsearch中, "properties":[{"name":"foo","value":"2"},{"name":"boo","value":"2"}]
的默認類型是用於自動創建此類字段的object
是object
。 該object
的缺點是它不會將一個子字段的值與另一個子字段的值相關聯,這意味着foo
不一定與2
關聯。 name
僅僅是值的陣列和value
是值的再次另一個數組與兩個之間沒有關聯。
如果需要上述關聯才能工作,則必須nested
。
但是,我遇到了同時需要這兩個功能的情況。 如果您需要兩者,則可以為映射設置include_in_parent: true
,以便您可以同時使用兩者。 我所看到的一種情況是在這里 。
"properties": {
"type": "nested",
"include_in_parent": true,
"properties": {
"name": {
"type": "string"
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.