#azure-cognitive-search #azure-search-.net-sdk
Вопрос:
У меня есть поле сложного идентификатора, содержащее буквы, цифры, пробелы и специальные символы. Я использовал анализатор ключевых слов в этом поле, но у меня возникли проблемы с фильтрацией результатов. Вот пример данных, которые будут содержаться в этом поле:
О-2011-006953 /4
С помощью анализатора ключевых слов я могу выполнить фильтр «содержит» в поле индекса, используя цифры, но не буквы. Работает следующий фильтр:
search.ismatch('/.*2011.*/', 'complex_identifier_field', 'full', 'all')
Но если я попытаюсь выполнить поиск по содержимому с помощью письма, я получу 0 результатов:
search.ismatch('/.*O.*/', 'complex_identifier_field', 'full', 'all')
Я считаю, что моя проблема в том, что мне нужен другой или пользовательский анализатор, и я недавно пытался использовать анализаторы NGram и пытался написать пользовательский анализатор с использованием маркера ключевых слов, но все еще не смог выполнить поиск по полю. Как я могу создать поле, которое является одним маркером; принимает буквенно-цифровые символы, пробелы и специальные символы; и позволяет мне выполнить фильтр содержит, чтобы найти любую часть поля идентификатора?
Обновить
Вот определение поля:
new Field("accession_number", DataType.String){ IsSearchable= true, IsFilterable = true, Analyzer = AnalyzerName.Keyword },
И вот точный поиск, который я использую:
var result = indexClient.Documents.Search(query, searchParameters: parameters);
где запрос = «печать» и параметры =
{
Facets = null,
Filter = search.ismatch('/.*O.*/', 'accession_number', 'full', 'all'),
HighlightFields = null,
HighlightPostTag = null,
HighlightPreTag = null,
IncludeTotalResultsCount = true,
MinimumCoverage = null,
OrderBy = null,
QueryType = Full,
ScoringParameters = null,
ScoringProfile = null,
SearchFields = null,
SearchMode = All,
Select = (9 fields),
Skip = 0,
Top = 50
}
Комментарии:
1. Спасибо за дополнительную информацию. Я не вижу ничего плохого. Чтобы разобраться в этом подробнее, было бы полезно увидеть: 1) JSON для определения индекса (вы можете получить это на портале Azure, перейдите в индекс, и там есть вкладка для JSON), 2) JSON для документа, который должен соответствовать, но не соответствует (для этого вы можете использовать обозреватель запросов на портале), и 3) запрос, который не выполняется, выполняется непосредственно в обозревателе запросов портала, а не через API. Попытка удалить слои при устранении неполадок.
Ответ №1:
В вашем примере значение O-2011-006953 /4
не соответствует регулярному /.O./
выражению, потому что для регулярного выражения требуется символ перед «O» («.» означает «ровно 1 символ в этой позиции»). Если вы хотите сопоставить подстроку в любом месте токена, вы можете использовать /.*O.*/
, где «O» является подстрокой,». » означает «любой символ», а «*» означает «ноль или более предыдущего элемента, в данном случае «.».
Обратите внимание, что этот тип поиска по регулярному выражению может быть медленным и не гарантирует полного возврата (т. Е. мы не можем возвращать все документы, которые могут соответствовать регулярному выражению, мы ограничиваем количество терминов, которые мы расширяем из регулярного выражения).
Комментарии:
1. Спасибо за ваш ответ. Я на самом деле использую
/.*O.*/
в качестве регулярного выражения. Я думаю, что переполнение стека, возможно, удалило звезды в моем первоначальном посте (возможно, потому, что я не заключил их в блок кода). Поэтому я считаю, что регулярное выражение, которое я использую, должно было найти документ. Я не уверен, что это имеет значение, но я не использую регулярное выражение для поиска, только фильтр. Каков рекомендуемый способ фильтрации результатов поиска с помощью поиска «содержит»? (Пользователи вводят текст для фильтрации результатов после поиска)2. Я просто попробовал сценарий (анализатор ключевых слов, регулярное выражение, расширяющееся в начале строки, с помощью search.ismatch ()), и это сработало. Интересно, не упускаем ли мы еще одно отличие? Можете ли вы обновить вопрос определением индекса (по крайней мере, определением для этого поля) и точным полным запросом, который вы отправляете?