Elasticsearch расширенный автозаполнение - PullRequest
0 голосов
/ 31 августа 2018

Я хочу, чтобы автозаполнение пользовательского ввода с Elasticsearch. Сейчас есть множество учебников, как это сделать, но ни один из них не посвящен действительно подробным материалам.

Последняя проблема, с которой я столкнулся в своем запросе, заключается в том, что он должен показывать результаты, которые не являются реальными "автозаполнениями". Пример: IS:

Я печатаю: "Кровать"

Нахожу: "Кровать", "Кровать", "Необычная кровать", "Каркас кровати"

ХОТИТЕ:

Я печатаю: "Кровать"

Я нахожу: "Кровать", "Каркас кровати", [другие результаты "Кровать XXX"], "Необычная кровать", "Большая кровать"

Так что я хочу, чтобы Elasticsearch сначала завершил «вправо», если это имеет смысл. А затем используйте результаты, которые имеют слова перед ним. Я пробовал подсказку для завершения, я не делаю другие вещи, которые хочу, но у меня есть та же проблема.

В немецком языке есть много примеров таких слов, как Bigbed (это не настоящее слово в английском, я знаю. Но я не хочу, чтобы эти слова имели высокие результаты. Но так как они соответствуют ближе, чем каркас кровати (потому что это 2 жетона) они появляются так высоко.

В данный момент это мой запрос:

POST autocompletion/_search?pretty
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "keyword": {
            "query": "Bed",
            "fuzziness": 1,
            "minimum_should_match": "100%"
          }
        }
      },
      "field_value_factor": {
        "field": "bias",
        "factor": 1
      }
    }
  }
}

1 Ответ

0 голосов
/ 31 августа 2018

Если вы используете подсказку по завершению эластичного поиска, как объяснено в https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters-completion.html, при запросах типа:

{
    "suggest": {
        "song-suggest" : {
            "prefix" : "bed", 
            "completion" : { 
                "field" : "suggest" 
            }
        }
    }
}

Вы получите:

{
    "took": 13,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 0,
        "max_score": 0.0,
        "hits": []
    },
    "suggest": {
        "song-suggest": [
            {
                "text": "bed",
                "offset": 0,
                "length": 3,
                "options": [
                    {
                        "text": "Bed",
                        "_index": "autocomplete",
                        "_type": "_doc",
                        "_id": "1",
                        "_score": 34.0,
                        "_source": {
                            "suggest": {
                                "input": [
                                    "Bed"
                                ],
                                "weight": 34
                            }
                        }
                    },
                    {
                        "text": "Bed Frame",
                        "_index": "autocomplete",
                        "_type": "_doc",
                        "_id": "3",
                        "_score": 34.0,
                        "_source": {
                            "suggest": {
                                "input": [
                                    "Bed Frame"
                                ],
                                "weight": 34
                            }
                        }
                    }
                ]
            }
        ]
    }
}

Если вместо этого вы хотите использовать search API, вы можете использовать 2 запроса:

  1. префикс запроса "кровать ****"
  2. с термином, начинающимся на "кровать"

Вот отображение:

{
    "mappings": {
        "_doc" : {
            "properties" : {
                "suggest" : {
                    "type" : "text",
                                      "fields" : {
                                            "keyword" : {
                                                "type" : "keyword"
                                            }
                                        }
                }
            }
        }
    }

Вот поисковый запрос:

{
    "query" : {
            "bool" : {
                "must" : [
                    {
                        "match" : {
                            "suggest" : "Bed"
                        }
                    }
                ],
                "should" : [
                    {
                        "prefix" : {
                            "suggest.keyword" : "Bed"
                        }
                    }
                ]
            }
        }
}

Условие must увеличит размер документа, начиная с "Bed". Et voilà!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...