Возврат позиции и выделение поисковых запросов в Elasticsearch

Я использую официальный клиент Elasticsearch-PHP, установленный на личном сервере Debian, и то, что я пытаюсь сделать, включает индексацию, поиск и выделение отдельных документов. т.е. каждый результат поиска будет возвращать только один документ, который затем будет выделен для поиска "простой строки запроса". Я также использую FVH (быстрое выделение векторов).

Мой вопрос похож на эту позицию в качестве результата, вместо выделения, и тестовый код в основном такой же, поэтому я не буду повторять это здесь. Однако в моем случае мне нужно и положение, и выделение. Я перешел по ссылке на документацию о векторах терминов, но, как и в случае с другим OP, мои поисковые запросы не являются точными словами сами по себе. В некоторых случаях это фразы. Как мне подойти к этому?

Мой вариант использования - искать только один документ (для каждого запроса) и представлять сводку результатов со ссылками, по которым пользователь может щелкнуть, чтобы перейти в определенное место в документе, откуда пришел этот результат. Если у меня есть индекс / позиция, я могу просто использовать его против полного источника документа. Я проверил документацию безрезультатно.

1 ответ

Вы можете попробовать установить специальный плагин, разработанный фондом Викимедиа, под названием Experimental Highlighter -github здесь

Вы можете установить elasticsearch 7.5 таким образом - для других версий elasticsearch обратитесь к странице проекта github:

./bin/elasticsearch-plugin install org.wikimedia.search.highlighter:experimental-highlighter-elasticsearch-plugin:7.5.1

И перезапустите elasticsearch.

Поскольку вам нужно получить также positions - если для вашего варианта использования смещения могут заменять позиции, перейдите к следующему абзацу - вы должны объявить свое поле с помощью termvector с опцией индекса "with_position_offset_payloads"- док здесь

PUT /my-index-000001
{ "mappings": {
    "properties": {
      "text": {
        "type": "text",
        "term_vector": "with_positions_offsets_payloads",
        "analyzer" : "fulltext_analyzer"
       }
     }
   }
}

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

PUT /my-index-000001
{ "mappings": {
    "properties": {
      "text": {
        "type": "text",
        "index_options": "offsets",
        "analyzer" : "fulltext_analyzer"
       }
     }
   }
}

Затем вы можете запросить экспериментальный маркер и вернуть только смещение части маркера:

{
  "query": {
    "match": {
      "text": "hello world"
    }
  },
  "highlight": {
    "order": "score",
    "fields": {
      "text": {
        "number_of_fragments": 10,
        "fragment_size": 15,
        "type": "experimental",
        "options": {"return_offset": true}
      }
    }
  }
}

Таким образом, из вашего запроса не возвращается текст, а только start offset и end offset- числа, обозначающие позицию. Чтобы получить выделенный контент, вам нужно войти внутрь['hits']['hits'][0]['_source']['text']-text - это ваше имя поля - и извлеките текст из поля, используя начальную точку смещения и конечную точку смещения. Вы должны убедиться, что используете правильную кодировку строки -UTF-8- иначе смещения не совпадают с текстом. Согласно документу:

Параметр return_offsets изменяет результаты выделенной строки на смещения выделенной строки, которые были бы выделены. Это полезно, если вам нужно выполнить проверку работоспособности на стороне клиента при выделении. Вместо размеченного фрагмента вы получите результат вида 0:0-5,18-22:22. Внешние числа - это начальное и конечное смещение фрагмента. Пары чисел, разделенные символами s, являются совпадениями. Число перед знаком - это начальное смещение, а число после - конечное смещение. Поля с несколькими значениями имеют смещение между собой на один символ.

Сообщите мне, может ли этот плагин помочь!

Другие вопросы по тегам