Я хочу показать 10 лучших записей и применить фильтр для определенных полей в эластичном поиске

#elasticsearch #elastic-stack #elasticsearch-5

#elasticsearch #эластичный стек #elasticsearch-5

Вопрос:

Это запрос для получения 10 лучших записей. Внутри этого есть ответ на имя поля, у нас есть запись «НЕОБРАБОТАННАЯ». Я хочу исключить НЕОБРАБОТАННОЕ внутри поля ответа.

Как написать запрос, чтобы получить как 10 лучших, так и исключить НЕОБРАБОТАННЫЕ

 GET /logstash-sdc-mongo-abcsearch/_search?size=0 

{
  "aggs": {
    "top_tags": {
      "terms": {
        "field": "question.keyword"
      },
      "aggs": {
        "top_faq_hits": {
          "top_hits": {
            "_source": {
              "includes": [
                "answer"
              ]
            },
            "size": 1
          }
        }
      }
    }
  }
}
 

Ответ №1:

Вы можете использовать must_not предложение, чтобы исключить документы, которые содержатся UNHANDLED в answer поле. Попробуйте следующий запрос —

Сопоставление индексов:

 {
  "mappings": {
    "properties": {
      "question": {
        "type": "keyword"
      },
      "answer": {
        "type": "keyword"
      }
    }
  }
}
 

Индексировать данные:

 {
  "question": "a",
  "answer": "b"
}
{
  "question": "c",
  "answer": "UNHANDLED"
}
 

Поисковый запрос:

 {
  "query": {
    "bool": {
      "must_not": {
        "term": {
          "answer": "UNHANDLED"
        }
      }
    }
  },
  "aggs": {
    "top_tags": {
      "terms": {
        "field": "question"
      },
      "aggs": {
        "top_faq_hits": {
          "top_hits": {
            "_source": {
              "includes": [
                "answer"
              ]
            },
            "size": 1
          }
        }
      }
    }
  }
}
 

Результат поиска:

 "aggregations": {
    "top_tags": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "a",
          "doc_count": 1,
          "top_faq_hits": {
            "hits": {
              "total": {
                "value": 1,
                "relation": "eq"
              },
              "max_score": 0.0,
              "hits": [
                {
                  "_index": "65563925",
                  "_type": "_doc",
                  "_id": "1",
                  "_score": 0.0,
                  "_source": {
                    "answer": "b"
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
 

Обновление 1:

Основываясь на приведенных ниже комментариях, попробуйте следующий запрос:

 {
  "query": {
    "bool": {
      "must_not": {
        "term": {
          "answer": "UNHANDLED"
        }
      },
      "must": {
        "term": {
          "source": "sonax"
        }
      }
    }
  },
  "aggs": {
    "top_tags": {
      "terms": {
        "field": "question"
      },
      "aggs": {
        "top_faq_hits": {
          "top_hits": {
            "_source": {
              "includes": [
                "answer"
              ]
            },
            "size": 1
          }
        }
      }
    }
  }
}
 

Комментарии:

1. Большое спасибо. Это сработало. Потрясающе. С новым годом

2. @Prabhudas8703 рад, что это сработало для вас 🙂 Не могли бы вы также проголосовать и принять ответ 🙂 С Новым годом 😃

3. Привет, еще одна вещь. Мне нужно использовать еще одно условие внутри приведенного выше запроса, которое должно включать поле (Source =»Sonax»)

4. @Prabhudas8703 вы хотите, чтобы это Sonax поле было включено в результат агрегирования?

5. Источник — это имя поля. Внутри источника мне нужны только записи Sonax.