Elasticsearch автозаполнение поиска среднего слова - PullRequest
0 голосов
/ 14 декабря 2018

Я на некоторое время застрял в этом.

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

Я использую упругий поиск v. 6.3.2, я попытался с запросом, подобным этим:

curl -X GET "http://127.0.0.1:9200/my_index/_search" -H 'Content-Type: application/json' -d '{"_source":false,"suggest":{"show-suggest":{"prefix":"turi","completion":{"field":"auto_suggest"}}}}'

или

curl -X GET "http://127.0.0.1:9200/my_index/_search" -H 'Content-Type: application/json' -d '{"_source":false,"suggest":{"show-suggest":{"text":"turi","completion":{"field":"auto_suggest"}}}}'

, но он работает только, если я ищу "alan", и он показывает все термины.

индекс:

"tokenizer": {
    "my_tokenizer": {
      "type": "ngram",
      "min_gram": 3,
      "max_gram": 4,
      "token_chars": [
        "letter",
        "digit"
      ]
    }
  }
}



"mappings": {
"poielement": {
  "numeric_detection": false,
  "date_detection": false,
  "dynamic_templates": [
    {
      "suggestions": {
        "match": "suggest_*",
        "mapping": {
          "type": "text",
          "analyzer": "my_analyzer",
          "search_analyzer": "my_analyzer",
          "copy_to": "auto_suggest",
          "store": true
        }
      }
    },
    {
      "property": {
        "match": "*",
        "mapping": {
          "analyzer": "my_analyzer",
          "search_analyzer": "my_analyzer"
        }
      }
    }
  ],
  "properties": {
    "auto_suggest": {
      "type": "completion"
    },
    "name_suggest": {
      "type": "completion"
    }
  }
}

}

1 Ответ

0 голосов
/ 14 декабря 2018

У нас точно такой же вариант использования, и именно так мы его решили.substring * * * * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * *. Ниже показан код для анализа custom substring: -

        TokenStream result = new WhitespaceTokenizer(SearchManager.LUCENE_VERSION_301, reader);
        result = new LowerCaseFilter(SearchManager.LUCENE_VERSION_301, result);
        result = new SubstringFilter(result, minSize);
        return result;

.код, я сначала использую WhitespaceTokenizer, а затем передаю его сначала LowerCaseFilter, а затем мой пользовательский SubstringFilter код, который можно настраивать на основе минимального количества символов, которые вы хотите использовать в своих токенах.

Приведенный выше код будет генерировать токены ниже для таких строк, как hellowworld, если вы установите минимальную длину подстроки 3.

Предоставление открытого URI для доступа к токенам, которые он генерирует, как для helloworld string и min.длина подстроки 3. генерирует много токенов.

https://justpaste.it/4i6gh

Также вы можете проверить токены, которые использует ваш пользовательский анализатор, используя _analyze api, https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-analyze.html

http://localhost:9200/jaipur/_analyze?text=helloworld&analyzer=substring

здесь jaipur - мое индексное имя, а helloworld - строка, для которой я хочу генерировать токены, используя substring.

РЕДАКТИРОВАТЬ Как предложено Nishant в комментариях, вы можете использовать Ngram Filter вместо фильтра подстроки, который обеспечивает встроенный Elastic.

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