More_like_this запрос с фильтром

У меня есть 1702 документа, проиндексированных в эластичном поиске, в котором есть категория в качестве одного из полей, а также поле с именем SequentialId.

Сначала я получил документы с категорией 1.1, которые находятся между документом 1 и документом 850, как показано ниже.

**POST testucb/docs/_search
{
    "size": 1702, 
    "query": {
        "bool": {
            "must": [
               {"match": {
                  "Category": "1.1"
               }}
            ],
            "filter":[
                {
                    "range":
                    {
                        "SequentialId":
                        {
                            "gte":1,
                            "lte":850

        }
    }
}
]
}
}
}**

приведенный выше запрос дал мне 834 документа, которые соответствуют категории 1.1. (У меня есть двоичный файл для анализа 834 _id из результирующего вывода JSON.) Теперь моя цель состоит в том, чтобы предоставить эти 834 _id в более похожий на этот запрос в качестве обучающего набора для остальных документов, которые являются моим тестовым набором (документы от 851 до 1702 - это мой тестовый набор)

Я попробовал этот запрос more_like_this ниже с фильтром.

POST /testucb/docs/_search
{

"size": 1702, 
    "fields": [
            "SequentialId",
            "Category",
            "PRIMARY_CONTENT_EN"
         ],
   "query": {
      "more_like_this": 
      {
         "fields": [
            "PRIMARY_CONTENT_EN"
         ],
        "like":[
           <-----------834 _ids goes here ---->
            ],
            **"filter":[
                {
                    "range":
                    {
                        "SequentialId":
                        {
                            "gte":851,
                            "lte":1702**

        }
    }
}
],
        "min_term_freq": 1,
        "min_doc_freq": 1,
         "max_query_terms": 15,            
        "min_word_len": 3,

        "stop_words": [
                   ], 
        "boost": 2,
        "include":false
}
}
}

Я получаю исключение при синтаксическом анализе запроса, в котором говорится, что MLT не поддерживает фильтр. Я не уверен, как я могу предоставить оставшиеся документы с последовательным идентификатором от 851 до 1702 в качестве моего тестового набора.

Надеюсь, я понял, чего я ожидаю. Не могли бы вы, ребята, помочь мне, как выполнить мою задачу? Я новичок в эластичном поиске.


person Sai    schedule 30.03.2016    source источник


Ответы (1)


Если вы хотите сделать больше похожий на этот запрос и отфильтровать заранее, вы должны использовать логический запрос с фильтром (версия Elasticsearch > 2.0)

POST /testucb/docs/_search
{
  "size": 1702,
  "fields": [
    "SequentialId",
    "Category",
    "PRIMARY_CONTENT_EN"
  ],
  "query": {
    "bool": {
      "must": [
        {
          "more_like_this": {
            "fields": [
              "PRIMARY_CONTENT_EN"
            ],
            "like": [
              <-----------834 _ids goes here ---->
            ],
            "min_term_freq": 1,
            "min_doc_freq": 1,
            "max_query_terms": 15,
            "min_word_len": 3,
            "stop_words": [],
            "boost": 2,
            "include": false
          }
        }
      ],
      "filter": {
        "range": {
          "SequentialId": {
            "gte": 851,
            "lte": 1702
          }
        }
      }
    }
  }
}

Если вы используете старую версию elasticsearch, вам следует использовать отфильтрованный запрос вместо этого

person Michael Stockerl    schedule 30.03.2016