Как показать конкретный c ответ от Elasticsearch? - PullRequest
0 голосов
/ 04 февраля 2020

Я использую Elasticsearch для хранения постраничных документов. Когда я выполняю полнотекстовый поиск, он возвращает мне все содержимое страницы, которое имеет лучший результат. Я хочу показать пользователю только конкретный c раздел страницы с ответом , а не все содержимое страницы.

Каков наилучший способ добиться этого?

Я видел, как Google использовал средство просмотра документов ngram и ограничивал его только указанием c ответного сегмента этой страницы. Я хочу что-то подобное в Elasticsearch.

Пожалуйста, дайте мне несколько советов или предложений.

1 Ответ

0 голосов
/ 04 февраля 2020

Вы можете использовать выделение !

Вот готовый к Кибане пример, начинающийся с нуля, при условии, что вы сохраняете всю страницу html, а не просто текст (хотя выделение работает просто отлично с простым текстом тоже):

1.

PUT my_index

2.

POST my_index/snippets/1
{
  "html_text": """
  <div class="top10">
    <h4>Top References</h4>
    <a href="/tags/default.asp">HTML Reference</a><br>
    <a href="/cssref/default.asp">CSS Reference</a><br>
    <a href="/jsref/default.asp">JavaScript Reference</a><br>
    <a href="/sql/sql_ref_keywords.asp">SQL Reference</a><br>
    <a href="/python/python_reference.asp">Python Reference</a><br>
    <a href="/w3css/w3css_references.asp">W3.CSS Reference</a><br>
    <a href="/bootstrap/bootstrap_ref_all_classes.asp">Bootstrap Reference</a><br>
    <a href="/php/php_ref_overview.asp">PHP Reference</a><br>
    <a href="/colors/colors_names.asp">HTML Colors</a><br>
    <a href="/jquery/jquery_ref_overview.asp">jQuery Reference</a><br>
    <a href="/java/java_ref_keywords.asp">Java Reference</a><br>
    <a href="/angular/angular_ref_directives.asp">Angular Reference</a><br>
  </div>
"""
}

3.

GET my_index/_search
{
  "query": {
    "match": {
      "html_text": "href"
    }
  },
  "_source": "highlight",
  "size": 10,
  "highlight": {
    "number_of_fragments": 1,
    "fragment_size": 12,
    "fields": {
      "html_text": {
        "number_of_fragments": 2,
        "order": "score",
        "pre_tags": [
          "<strong>"
        ],
        "post_tags": [
          "</strong>"
        ]
      }
    }
  }
}

, что дает

{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.575738,
    "hits": [
      {
        "_index": "my_index",
        "_type": "snippets",
        "_id": "1",
        "_score": 0.575738,
        "_source": {},
        "highlight": {
          "html_text": [
            "</a><br>\n<a <strong>href</strong>",
            "</a><br>\n<a <strong>href</strong>"
          ]
        }
      }
    ]
  }
}

Вы можете указать, сколько фрагментов вы хотите и сколько они должны быть. Если они совпадают, они будут доступны в hits[].highlight части ответа.

...