Сопоставьте все документы, за исключением некоторых терминов, используя полный синтаксис Lucene

#azure-cognitive-search

#azure-когнитивный поиск

Вопрос:

Веб-страница поиска нашего сервиса по умолчанию использует * полный запрос Lucene для сопоставления всех документов. Это происходит до того, как пользователь предоставил какие-либо условия поиска. Есть некоторые данные (в нашем случае тестовые данные), которые мы хотим исключить из результата поиска.

Возможно ли сопоставить все документы, но исключить подмножество всех документов?

Например, предположим, что у нас есть поле «владельцы», и мы хотим исключить документы с владельцем «testA» и «TestB». Следующий запрос, похоже, не работает с подходом сопоставления всех:

Запрос: search=* -владельцы: testA -владельцы:TestBamp;QueryType=fullamp;$orderby=созданный desc
Ошибка: "Не удалось проанализировать строку запроса. См . https://aka.ms/azure-search-full-query для поддерживаемого синтаксиса."

При поиске чего-либо, кроме * , этот подход работает нормально. Например:

Запрос: search=foo -owners:testA -owners:TestBamp;QueryType=полный amp;$orderby= созданный desc
Результат: (многие документы совпадают)

Я рассмотрел $filter для этого и использую $filter=filterableOwners/all(p: p ne 'testa' and p ne 'testb') , но у этого есть следующие недостатки:

  • индекс должен быть перестроен с фильтруемым полем
  • анализаторы не могут быть использованы, поэтому нечувствительность к регистру должна быть реализована путем перевода значений в нижний регистр и выражения фильтра

В идеале это можно было бы сделать, используя только search параметр запроса с текстом запроса Lucene.

Ответ №1:

Я нашел обходной путь для проблемы. Если в ваших документах есть поле, которое всегда имеет значение, вы можете использовать .* регулярное выражение для сопоставления всех значений в поле и, следовательно, для сопоставления всех документов.

Например, предположим, что packageId поле имеет значение для всех документов.

Неверно (как указано в исходном вопросе):

 Query:  search=* -owners:testA -owners:testBamp;queryType=fullamp;$orderby=created desc
  

Правильно:

Запрос: search=PackageID:/.*/ -владельцы:testA -owners:TestBamp;QueryType=full amp;$orderby= созданный desc