Задать вопрос
mark_edinoroglove
@mark_edinoroglove

Правильный способ реализовать поиск с автодополнением по одному слову?

Подскажите пожалуйста, есть на текущий момент такие параметры индекса
$params = [
            'index' => 'products',
            'body' => [
                'settings' => [
                    'number_of_shards' => 3,
                    'number_of_replicas' => 1,
                    "analysis" => [
                        "filter" => [
                            "russian_stop" => [
                                "type" => "stop",
                                "stopwords" => "_russian_"
                            ],
                            "russian_keywords" => [
                                "type" => "keyword_marker",
                                "keywords" => []
                            ],
                            "russian_stemmer" => [
                                "type" => "stemmer",
                                "language" => "russian"
                            ],
                            "edge_ngram_filter" => [
                                "type" => "edge_ngram",
                                "min_gram" => 1,
                                "max_gram" => 20
                            ]
                        ],
                        "analyzer" => [
                            "rebuilt_russian" => [
                                "tokenizer" => "standard",
                                "filter" => [
                                    "lowercase",
                                    "russian_stop",
                                    "russian_keywords",
                                    "russian_stemmer"
                                ]
                            ],
                            "edge_ngram_analyzer" => [
                                "tokenizer" => "standard",
                                "filter" => [
                                    "lowercase",
                                    "edge_ngram_filter"
                                ]
                            ]
                        ]
                    ],
                ],
                'mappings' => [
                    'properties' => [
                        'name' => [
                            'type' => 'text',
                            'analyzer' => 'rebuilt_russian',
                            'fields' => [
                                "edge_ngram" => [
                                    "type" => "text",
                                    "analyzer" => "edge_ngram_analyzer"
                                ]
                            ]
                        ],
                        'description' => [
                            'type' => 'text',
                            'analyzer' => 'rebuilt_russian',
                            'fields' => [
                                "edge_ngram" => [
                                    "type" => "text",
                                    "analyzer" => "edge_ngram_analyzer"
                                ]
                            ]
                        ],
                        'age' => [
                            'type' => 'integer',
                            'null_value' => null,
                        ],
                        'price' => [
                            'type' => 'integer'
                        ],
                        'gender' => [
                            'type' => 'keyword',
                            'null_value' => null,
                        ]
                    ]
                ]
            ]
        ];


Подскажите как я могу получать автодополнение поиска по одному слову, грубо говоря я напишу в поиск Щенок и мне выведутся слова Лабрадора, Чихуахуа и тд?
  • Вопрос задан
  • 353 просмотра
Подписаться 2 Средний 4 комментария
Пригласить эксперта
Ответы на вопрос 1
Davidaa_WoW
@Davidaa_WoW
Зависит от того, что вы храните в индексе, и какой результат в итоге хотите получить.
Какие могут быть кейсы:
1. В индексе хранится много чего: кошки, собаки, попугаи и т.д.
Решение: заводите новое поле, например 'pet_type'. Устанавливайте в него значение, например: 'собака'. Далее, создаёте статический фильтр синонимов в индексе, называете его, например 'pet_analyzer' и прописываете список необходимых синонимов. В результате должно получиться, что-то типа такого:
PUT /pets_index
{
  "settings": {
    "analysis": {
      "filter": {
        "pet_synonyms": {
          "type": "synonym",
          "synonyms": [
            "собака, щенок, кобель => dog",
            "кошка, кот, котёнок => cat",
            "попугай, попугайчик => parrot"
          ]
        }
      },
      "analyzer": {
        "pet_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": ["lowercase", "pet_synonyms"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "pet_type": {
        "type": "text",
        "analyzer": "pet_analyzer"
      }
    }
  }
}

2. В индексе хранятся только собаки, либо вам нужно распределение (щенки/взрослые собаки/распределение по полу)
В таком случае, добавляете эту характеристику прямо в name. То есть документ у вас будет называться: 'Щенок лабрадора'. Далее, смотрите на типы формирования входящих запросов. Вам могут подойти:
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы