Запрос о значении ответа
Как написать условный запрос по нескольким полям? Объясните: У меня есть индекс, допустим "case" и поля: "title", "secondTitle(contain nested obj)", "source(contain nested obj)". Теперь я хочу искать по заголовку и номеру документа внутри secondTitle, который также содержится в source поле другого документа.
PUT /case_indx_tmp_tmp
{
"mappings": {
"properties": {
"title":{
"type": "text",
"fields": {
"title":{
"type":"keyword"
}
}
},
"secondTitle":{
"type": "nested",
"properties": {
"second_title":{
"type":"text",
"fields": {
"secondtitle":{
"type":"keyword"
}
}
}
}
},
"source":{
"type": "nested",
"properties": {
"source_title":{
"type":"text",
"fields": {
"sourcetitle":{
"type":"keyword"
}
}
}
}
}
}
}
}
PUT /case_indx_tmp_tmp/_doc/1
{
"title" : "Case 1",
"secondTitle" : [
{
"case_title" : "Case 2"
}
],
"source":[
{
"source_title":"Case 3"
},
{
"source_title":"Case 4"
}
]
}
PUT /case_indx_tmp_tmp/_doc/2
{
"title" : "Case 2",
"secondTitle" : [
{
"case_title" : "Case 3"
},
{
"case_title" : "Case 4"
},
{
"case_title" : "Case 1"
}
],
"source":[
{
"source_title":"Case 1"
}
]
}
PUT /case_indx_tmp_tmp/_doc/3
{
"title" : "Case 3",
"secondTitle" : [
{
"case_title" : "Case 5"
},
{
"case_title" : "Case 4"
},
{
"case_title" : "Case 1"
}
],
"source":[
{
"source_title":"Case 2"
},
{
"source_title":"Case 5"
}
]
}
PUT /case_indx_tmp_tmp/_doc/4
{
"title" : "Case 5",
"source":[
{
"source_title":"Case 3"
},
{
"source_title":"Case 4"
},
{
"source_title":"Case 2"
}
]
}
если поисковый запрос - "Case", то будет возвращено заголовок: Дело 1 secondTitle_count: 1
заголовок: Случай 2 secondTitle_count: 3
заголовок: Случай 3 secondTitle_count: 2
title: Случай 5 secondTitle_count: 0
Моим решением было итерация всех документов, которые возвращаются после поискового запроса, и создание нового объекта bool query для поля "source", где значения находятся из secondTitle.
Вы можете использовать комбинацию агрегации терминов и вложенной агрегации с агрегацией подсчета значений.
В следующем запросе,
Запрос
matchиспользуется для получения только тех документов, которые содержатcaseв полеtitle.Агрегация терминов создаст ведро всех уникальных значений поля
title.Вложенная агрегация вместе с агрегацией подсчета значений будет агрегировать результат агрегации терминов и получит подсчет документов, присутствующих в объекте
secondTitle.
POST case_indx_tmp_tmp/_search
{
"size": 0,
"query": {
"match": {
"title": "case"
}
},
"aggs": {
"top_tags_per_comment": {
"terms": {
"field": "title.title"
},
"aggs": {
"Services": {
"nested": {
"path": "secondTitle"
},
"aggs": {
"secondTitle_count": {
"value_count": {
"field": "secondTitle.case_title.keyword"
}
}
}
}
}
}
}
}
Результатом поиска будет
"aggregations" : {
"top_tags_per_comment" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "Case 1",
"doc_count" : 1,
"Services" : {
"doc_count" : 1,
"secondTitle_count" : {
"value" : 1
}
}
},
{
"key" : "Case 2",
"doc_count" : 1,
"Services" : {
"doc_count" : 3,
"secondTitle_count" : {
"value" : 3
}
}
},
{
"key" : "Case 3",
"doc_count" : 1,
"Services" : {
"doc_count" : 3,
"secondTitle_count" : {
"value" : 3
}
}
},
{
"key" : "Case 5",
"doc_count" : 1,
"Services" : {
"doc_count" : 0,
"secondTitle_count" : {
"value" : 0
}
}
}
]
}
}