Я борюсь с эластичным поисковым запросом.
Это примеры документов, которые я хотел бы запросить. Это документы с общими свойствами
[
{
"field1": "value",
"properties": [
{
"propertyBooleanValue": null,
"propertyName": "Product name",
"propertyDateValue": null,
"propertyType": "TEXT",
"propertyStringValue": "SUPER Cool Extreme",
"propertyNumericValue": null
},
{
"propertyBooleanValue": null,
"propertyName": "Product expiration date",
"propertyDateValue": null,
"propertyType": "DATE",
"languageCode": null,
"propertyNumericValue": null
}
]
},
{
"field1": "blah blah",
"properties": [
{
"propertyBooleanValue": null,
"propertyName": "Product name",
"propertyDateValue": null,
"propertyType": "TEXT",
"propertyStringValue": "So boring",
"propertyNumericValue": null
},
{
"propertyBooleanValue": null,
"propertyName": "Product expiration date",
"propertyDateValue": "2020-04-02",
"propertyType": "DATE",
"languageCode": null,
"propertyNumericValue": null
}
]
},
{
"field1": "wow2",
"properties": [
{
"propertyBooleanValue": null,
"propertyName": "Product name",
"propertyDateValue": null,
"propertyType": "TEXT",
"propertyStringValue": "iPear",
"propertyNumericValue": null
},
{
"propertyBooleanValue": null,
"propertyName": "Product expiration date",
"propertyDateValue": null,
"propertyType": "DATE",
"languageCode": null,
"propertyNumericValue": null
}
]
}
]
Я хотел бы запрашивать только документы с вложенным объектом, у которого есть свойство с "propertyName" = "Дата истечения срока действия продукта" и "propertyDateValue" = null
Я использую запрос, но он возвращает все документы:
{
"query": {
"bool": {
"must": [
{
"nested": {
"query": {
"bool": {
"must": [
{
"bool": {
"must_not": [
{
"exists": {
"field": "properties.propertyDateValue"
}
}
]
}
},
{
"term": {
"properties.propertyName": {
"value": "Product expiration date"
}
}
}
]
}
},
"path": "properties"
}
}
]
}
}
}
Мы используем эластичный поиск 7.7
1 ответ
Как упомянул @jaspreet, результат ожидается. Чтобы уточнить это, вы можете использовать параметр inner_hits
для извлечения только тех вложенных вложенных документов properties
', которые фактически соответствуют обоим запросам, т.е.:
{
"_source": "inner_hits", <---- hiding the default response
"query": {
"bool": {
"must": [
{
"nested": {
"query": {
"bool": {
"must": [
{
"bool": {
"must_not": [
{
"exists": {
"field": "properties.propertyDateValue"
}
}
]
}
},
{
"term": {
"properties.propertyName": {
"value": "Product expiration date"
}
}
}
]
}
},
"path": "properties",
"inner_hits": {} <----- needs to be here
}
}
]
}
}
}
Получая
[
{
"_index" : "mich",
"_type" : "_doc",
"_id" : "6iLSVHEBZbobBB0NSl9x",
"_score" : 0.6931472,
"_source" : { },
"inner_hits" : {
"properties" : {
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.6931472,
"hits" : [
{
"_index" : "mich",
"_type" : "_doc",
"_id" : "6iLSVHEBZbobBB0NSl9x",
"_nested" : {
"field" : "properties",
"offset" : 1
},
"_score" : 0.6931472,
"_source" : {
"propertyBooleanValue" : null,
"propertyName" : "Product expiration date",
"propertyDateValue" : null,
"propertyType" : "DATE",
"languageCode" : null,
"propertyNumericValue" : null
}
}
]
}
}
}
},
...
]
Что, вероятно, было тем, что вы искали.
Имейте в виду, что приведенный выше запрос отличается от следующего, где у вас есть два отдельных предложения bool-must, которые игнорируют соединение AND по сравнению с первым запросом. В этом случае inner_hits
должно иметь уникальное имя.
{
"_source": "inner_hits",
"query": {
"bool": {
"must": [
{
"nested": {
"path": "properties",
"query": {
"bool": {
"must": [
{
"bool": {
"must_not": [
{
"exists": {
"field": "properties.propertyDateValue"
}
}
]
}
}
]
}
},
"inner_hits": {
"name": "NULL_propertyDateValue"
}
}
},
{
"nested": {
"path": "properties",
"query": {
"bool": {
"must": [
{
"term": {
"properties.propertyName": {
"value": "Product expiration date"
}
}
}
]
}
},
"inner_hits": {
"name": "MATCH_IN_propertyName"
}
}
}
]
}
}
}
Короче говоря, идите с первым запросом и не стесняйтесь ограничивать возвращаемый ответ, используя inner_hits
.
Похожие вопросы
Новые вопросы
elasticsearch
Elasticsearch - это бесплатная и открытая, распределенная, спокойная поисковая система на основе Lucene.