Поиск Azure с использованием синтаксиса запроса Lucene возвращает неверные результаты - PullRequest
0 голосов
/ 05 июля 2018

Я использую Microsoft.Azure.Search .NET SDK v5.0.1. Я пытаюсь выполнить поиск по индексу поиска Azure следующим образом: Documents.SearchAsync («имя поля: val * AND timeStamp: 2018-05-03T13 \: 23 \: 59Z»). Результаты неверны. В моем индексе ровно 2 документа с этой отметкой времени. В моем индексе 121 документ, имя поля которого начинается с val. Когда я запускаю приведенный выше запрос с использованием SDK, он всегда возвращает 121 документ. Есть ли какой-то особый способ запроса метки времени, который мне не хватает?

1 Ответ

0 голосов
/ 05 июля 2018

Здесь нужно сделать несколько замечаний:

  1. В вашем определении индекса, я полагаю, вы установили timeStamp в качестве строки. В противном случае вы не смогли бы выполнить поисковый запрос, поскольку поля DateTime недоступны для поиска. Во-первых, я бы посоветовал не рассматривать timeStamp как строку. Это связано с тем, что доступные для поиска поля проходят через анализ (один из них - токенизация) Ссылка на разбор запроса . В вашем случае запрос timestamp (скажем, 2018-05-03) будет разбит на токены на более мелкие составляющие (2018, 05, 03), и будут возвращены документы, содержащие любое из этих условий. Вот почему вы наблюдаете за тем, что видите.

  2. Ваш сценарий представляется классическим случаем «фильтрации» результатов на основе критериев, за которыми следует «поиск» по отфильтрованным документам. Для этого вам необходимо сделать следующее:

    • Используйте фильтр на временной метке, чтобы он не проходил анализ
    • Для отфильтрованных результатов примените поисковый запрос.
    • Ссылка
  3. Однако я настоятельно рекомендую сделать столбец timeStamp датой и временем для более разумной семантики.

В качестве примера, вот как вы могли бы достичь комбо фильтра + поиска:

parameters = new SearchParameters() 
{
   Filter = "timeStamp eq '2018-05-03'"
};
Documents.SearchAsync("fieldname:val*", parameters);
...