Как правильно реализовать функцию автодополнения при поиске по одному слову?

Могли бы вы сообщить, актуальны ли на данный момент следующие параметры для индекса? 

<pre><code class="php">
$params = [
    'index' =&gt; 'products',
    'body' =&gt; [
        'settings' =&gt; [
            'number_of_shards' =&gt; 3,
            'number_of_replicas' =&gt; 1,
            "analysis" =&gt; [
                "filter" =&gt; [
                    "russian_stop" =&gt; [
                        "type" =&gt; "stop",
                        "stopwords" =&gt; "_russian_"
                    ],
                    "russian_keywords" =&gt; [
                        "type" =&gt; "keyword_marker",
                        "keywords" =&gt; []
                    ],
                    "russian_stemmer" =&gt; [
                        "type" =&gt; "stemmer",
                        "language" =&gt; "russian"
                    ],
                    "edge_ngram_filter" =&gt; [
                        "type" =&gt; "edge_ngram",
                        "min_gram" =&gt; 1,
                        "max_gram" =&gt; 20
                    ]
                ],
                "analyzer" =&gt; [
                    "rebuilt_russian" =&gt; [
                        "tokenizer" =&gt; "standard",
                        "filter" =&gt; [
                            "lowercase",
                            "russian_stop",
                            "russian_keywords",
                            "russian_stemmer"
```
  • 6 декабря 2024 г. 23:43
Ответы на вопрос 2
Для реализации функции автодополнения по одному слову с использованием Elasticsearch, вы можете использовать фильтры `edge_ngram`, которые позволяют создавать префиксные токены, что очень удобно для автодополнения. Ваша текущая конфигурация индекса выглядит довольно хорошо, но есть несколько моментов, которые стоит учесть.

### Общая структура настройки индекса

```php
$params = [
    'index' => 'products',
    'body' => [
        'settings' => [
            'number_of_shards' => 3,
            'number_of_replicas' => 1,
            'analysis' => [
                'filter' => [
                    'russian_stop' => [
                        'type' => 'stop',
                        'stopwords' => '_russian_'
                    ],
                    '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_stemmer'
                        ]
                    ],
                    'autocomplete' => [
                        'tokenizer' => 'standard',
                        'filter' => [
                            'lowercase',
                            'edge_ngram_filter'
                        ]
                    ]
                ]
            ]
        ],
        'mappings' => [
            'properties' => [
                'name' => [
                    'type' => 'text',
                    'analyzer' => 'rebuilt_russian',
                    'search_analyzer' => 'rebuilt_russian',
                ],
                'autocomplete' => [
                    'type' => 'text',
                    'analyzer' => 'autocomplete',
                ]
            ]
        ]
    ]
];
```

### Как это работает

1. **Фильтр edge_ngram**: Используется для создания токенов, которые начинаются с одного и более символов, позволяя тем самым реализовать автодополнение.
2. **Анализаторы**: В вашем случае вы добавили два анализатора: `rebuilt_russian` для корректного индексирования текста и `autocomplete` для автодополнения.
3. **Свойство autocomplete**: Добавлено в маппинг для хранения данных, которые будут использоваться для автодополнения.

### Запрос для автодополнения

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

```php
$searchParams = [
    'index' => 'products',
    'body' => [
        'query' => [
            'match' => [
                'autocomplete' => [
                    'query' => 'ваш_текст_для_поиска',
                    'operator' => 'and'
                ]
            ]
        ]
    ]
];
```

### Вывод

Эти настройки и запросы должны позволить вам эффективно реализовать функцию автодополнения по одному слову. Однако всегда тестируйте производительность и качество получения результатов, особенно если у вас большой объем данных. 

Если у вас есть дополнительные вопросы или вам нужно дальнейшее уточнение, пожалуйста, дайте знать!
Зависит от того, что вы храните в индексе, и какой результат в итоге хотите получить. 
Какие могут быть кейсы:
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. То есть документ у вас будет называться: 'Щенок лабрадора'. Далее, смотрите на типы формирования входящих запросов. Вам могут подойти:
Похожие вопросы