Elasticsearch проверяет API, объясняет термины запроса из большего количества подобных по одному полю, получая выделенные термины

У меня есть индекс с фактически преобразованным текстом Word или PDF-документа в виде простого текста «document_texts», построенного на стеке Rails, ActiveModel — это DocumentText с использованием драгоценных камней рельсов elasticsearch для модели и API. Я хочу иметь возможность сопоставлять похожие текстовые документы или PDF-файлы на основе текста документа

Я смог сопоставить документы друг с другом, используя

response = DocumentText.search \
  query: {
      filtered: {
          query: {
              more_like_this: {
                  ids: ["12345"]
              }
          }
      }
  }

Но я хочу посмотреть, КАК был запрошен результирующий набор, какие термины запроса использовались для сопоставления документов.

Используя драгоценный камень API elasticsearch, я могу сделать следующее

 client=Elasticsearch::Client.new log:true

 client.indices.validate_query index: 'document_texts',
    explain: true,
    body: {
      query: {
          filtered: {
              query: {
                  more_like_this: {
                      ids: ['12345']
                  }
              }
          }
      }
   }

Но я получаю это в ответ

{"valid":true,"_shards":{"total":1,"successful":1,"failed":0},"explanations":[{"index":"document_texts","valid":true,"explanation":"+(like:null -_uid:document_text#12345)"}]}

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

Я не уверен, возможно ли это, но я хотел бы посмотреть, смогу ли я получить 25 терминов, используемых анализатором elasticsearchs, а затем повторно применить запрос с повышенными значениями для терминов в зависимости от моего выбора.

Я также хочу выделить это в тексте документа, но попробовал это

response = DocumentText.search \
  from: 0, size: 25,
  query: {
      filtered: {
          query: {
              more_like_this: {
                  ids: ["12345"]
              }
          },
          filter: {
              bool: {
                  must: [                            
                      {match: { documentable_type: model}}
                 ]
              }
          }

      }
  },
  highlight: {
    pre_tags: ["<tag1>"],
    post_tags: ["</tag1>"],
    fields: {
        doc_text: {
                type_name: {
                content: {term_vector: "with_positions_offsets"}
            }
        }
    }
  }

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


person user1320651    schedule 10.10.2016    source источник


Ответы (1)


Включение некоторых стоп-слов только для всех остальных, это даст простой способ показать термины, используемые для запроса. Это не решает проблему выделения, но может дать термины, используемые для процесса сопоставления mlt. Некоторые другие настройки используются только для отображения

  curl -XGET 'http://localhost:9200/document_texts/document_text/_validate/query?rewrite=true' -d '
  {
      "query": {
            "filtered": {
                "query": {
                    "more_like_this": {
                        "ids": ["12345"],
                        "min_term_freq": 1,
                        "max_query_terms": 50,
                        "stop_words": ["this","of"]
                    }
                }
            }
        }
    }'

https://github.com/elastic/elasticsearch-ruby/pull/359

Как только это объединится, это должно быть проще

client.indices.validate_query index: 'document_texts',
  rewrite: true,
  explain: true,
  body: {
    query: {
        filtered: {
            query: {
                more_like_this: {
                    ids: ['10538']
                }
            }
        }
    }
 }
person user1320651    schedule 10.10.2016