Эластичный поиск - example.com против примера - PullRequest
0 голосов
/ 07 января 2019

Мы используем эластичный поиск 5.6.9, чтобы включить поиск на нашем сервере Django 1.11.

Если я индексирую данные example.com и ищу example.com, я получаю результат поиска, но если я ищу example, я не получаю никаких результатов поиска.

В идеале я хочу, чтобы example и example.com оба работали и возвращали один и тот же результат поиска.

Как я могу получить такое поведение?

Я думал, что мне придется заменить анализатор и токенизатор на одно и то же.

Использование simple анализатора кажется правильным решением. Пример: POST _analyze { "analyzer": "simple", "text": "example.com" } возвращает example и com как отдельные токены { "tokens": [ { "token": "example", "start_offset": 0, "end_offset": 7, "type": "word", "position": 0 }, { "token": "com", "start_offset": 8, "end_offset": 11, "type": "word", "position": 1 } ] }

Я думаю, что мне нужно установить один и тот же анализатор / токенизатор при индексировании данных и запросе при поиске.

Я попытался установить analyzer на simple, как описано здесь: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/analyzer.html Тем не менее, теперь мне все еще нужно искать example.com вместо example, и плюс СЕЙЧАС я ничего не вижу в highlight результата поиска.

Я не совсем понимаю, как это приводит к результату поиска, но не к highlight.

Я здесь совсем с базы?

1 Ответ

0 голосов
/ 07 января 2019

Может быть, этот пример будет вам полезен:

Отображение

PUT /so54071449
{
  "mappings": {
    "doc": {
      "properties": {
        "url": {
          "type": "text",
          "term_vector": "with_positions_offsets",
          "fields": {
            "simple": {
              "type": "text",
              "analyzer": "simple",
              "search_analyzer": "simple",
              "term_vector": "with_positions_offsets"
            }
          }
        }
      }
    }
  }
}

Добавить документ

POST /so54071449/doc
{
  "url": "example.com"
}

Поиск по example

GET /so54071449/_search
{
  "query": {
    "multi_match": {
      "query": "example",
      "fields": ["url", "url.simple"]
    }
  },
  "highlight": {
    "fields": {
      "url": {
        "matched_fields": [
          "url",
          "url.simple"
        ]
      }
    }
  }
}

Результат по example

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.25811607,
    "hits": [
      {
        "_index": "so54071449",
        "_type": "doc",
        "_id": "AWgoEwDT2HOwokHu0yvd",
        "_score": 0.25811607,
        "_source": {
          "url": "example.com"
        },
        "highlight": {
          "url": [
            "<em>example</em>.com"
          ]
        }
      }
    ]
  }
}

Поиск по example.com

GET /so54071449/_search
{
  "query": {
    "multi_match": {
      "query": "example.com",
      "fields": ["url", "url.simple"]
    }
  },
  "highlight": {
    "fields": {
      "url": {
        "matched_fields": [
          "url",
          "url.simple"
        ]
      }
    }
  }
}

Результат по example.com

{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.51623213,
    "hits": [
      {
        "_index": "so54071449",
        "_type": "doc",
        "_id": "AWgoEwDT2HOwokHu0yvd",
        "_score": 0.51623213,
        "_source": {
          "url": "example.com"
        },
        "highlight": {
          "url": [
            "<em>example.com</em>"
          ]
        }
      }
    ]
  }
}

Я использовал мультипол matched_fields для объединения выделения результатов из url и url.simple в одно поле.

...