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

Я учусь использовать лазурный поиск, и я не нахожу способа искать термин со средним тире в поле 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. Оно работает. Я просто хочу ответить более подробно

Другие вопросы по тегам