Как искать термин со средним тире в лазурном поиске?
Я учусь использовать лазурный поиск, и я не нахожу способа искать термин со средним тире в поле ItemId, не волнует, находится ли термин для поиска в начале или в середине.
У меня есть эти поля с данными в моем индексе
+-----+--------------------+-------------+
| Cat | ItemId | Description |
+-----+--------------------+-------------+
| 100 | 400800-1100103U | desc item 1 |
| 100 | 400800-11001066 | desc item 2 |
| 100 | 400800-11001068 | desc item 3 |
| 101 | 400800-110010F6 | desc item 4 |
+-----+--------------------+-------------+
Это моя конфигурация поля индекса:
+-------------+-------------+-----------+-----------+-----------+------------+
| Field Name | Retrievable | Filerable | Sortable | Facetable | Searchable |
+-------------+-------------+-----------+-----------+-----------+------------+
| Cat | OK | OK | OK | OK | X |
| ItemId | OK | OK | OK | OK | OK |
| Description | OK | | | | |
+-------------+-------------+-----------+-----------+-----------+------------+
И это мой настраиваемый анализатор поля ItemId для генерации только одного токена, даже если он имеет средний штрих.
{
"@odata.type": "#Microsoft.Azure.Search.CustomAnalyzer",
"name": "keyword_lowercase",
"tokenizer": "keyword_v2",
"tokenFilters": [
"lowercase"
],
"charFilters": []
}
Если я буду искать по этому запросу: $select=RowKey&search=400800-1100*
Я получаю такие результаты:
- 400800-1100103U
- 400800-11001066
- 400800-11001068
- 400800-110010F6
Но если я попытаюсь выполнить поиск со средним термином вроде этого: $select=RowKey&search=RowKey:(00800-1100*)~
Я получаю 0 результатов.
Итак, как я могу искать термин со средним тире в ItemId, неважно, находится ли термин для поиска в начале или в середине?
2 ответа
Я считаю, что этот пост отвечает на ваш вопрос с помощью поиска по регулярным выражениям, но имеет некоторые соображения. В качестве альтернативы вы можете рассмотреть возможность использования нечеткого поиска или использовать токенизатор Edge N-грамм с фильтром обратного токена в зависимости от вашего конкретного сценария.
Я удаляю анализатор и меняю GET на POST, используя этот код в теле запроса.
{
"queryType": "full",
"search": "/.*00-11.*/",
"searchFields": "ItemId",
"select": "ItemId",
"count": true,
"top": 10
}
При использовании свойства полного запроса с анализатором синтаксиса Lucene и регулярным выражением поиск работает должным образом.
Обратите внимание, что если вы попытаетесь использовать это регулярное выражение в обозревателе поиска по запросу в Azure, это не даст никаких результатов. Я думаю, это потому, что проводник поиска использует запрос GET.
спасибо за ответ Corom - MSFT. Оно работает. Я просто хочу ответить более подробно