Фильтр AzureSearch не работает

121
11

Я перенесла свои данные SQL в документ AzureSearch, чтобы попробовать новые возможности поиска. Я не могу фильтровать данные с помощью.net sdk (3.0.4)

public IActionResult Search(string state, string category, string search, short pageNumber = 1, short pageSize = 10)
{
SearchIndexClient indexClient = new SearchIndexClient(searchServiceName, "search", new SearchCredentials(searchServiceApiKey));

DocumentSearchResult<SearchResultDto> results = null;
if (string.IsNullOrWhiteSpace(search))
search = "*";
if (state.Equals("All", StringComparison.InvariantCultureIgnoreCase))
state = string.Empty;

SearchParameters parameters = new SearchParameters()
{
Filter = "state eq " + state,
Top = pageSize,
Skip = (pageNumber - 1) * pageSize,
SearchMode = SearchMode.All,
IncludeTotalResultCount = true
};

try
{
results = indexClient.Documents.Search<SearchResultDto>(search, parameters);
return Ok(results.Results);
}
catch (Exception ex)
{
Console.WriteLine("Error querying index: {0}\r\n", ex.Message.ToString());
throw ex;
}
}

Я получаю ошибку "Исключение было выбрано целью вызова".

Параметры raw value: $ count = true & $ filter = state %20eq %20 & queryType = simple & searchMode = all & $ skip = 0 & $ top = 10

когда я использовал значение параметра в AzureSearch, выясняю, что я получаю ошибку Неверное выражение: выражение, ожидаемое в позиции 19 в 'state eq delhi eq'.\r\nПараметр: $ filter

Что не так с моим кодом?

спросил(а) 2018-02-03T09:31:00+03:00 2 года, 8 месяцев назад
1
Решение
58

Есть несколько проблем с вашим фильтром.

Строковые литералы в OData ограничены одинарными кавычками. Если вы оставите кавычки, строка будет выглядеть как имя поля, но сопоставление полей с другими полями не разрешено в Azure Search (также, вероятно, в вашем индексе нет поля с именем delhi). Попробуйте state eq 'delhi'. Фильтр, который вы пытались использовать в Search Explorer, имеет дополнительный эквалайзер в конце: "state eq delhi eq". Если вы удалите дополнительный эквалайзер и поместите одинарные кавычки вокруг дели, он должен работать. После исправления синтаксических ошибок фильтр по-прежнему может работать не так, как предполагалось. Фильтры чувствительны к регистру, поэтому, если значение, которое вы пытаетесь сопоставить, на самом деле "Дели с капиталом D, вы не получите матч. Если поле состояния соответствует необработанному пользовательскому вводу, который может иметь неправильный случай, лучше использовать параметр searchText вместо фильтра.

ответил(а) 2018-02-03T19:27:00+03:00 2 года, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема