Поиск полей, содержащих поисковый запрос
Я провел несколько исследований по поисковым запросам Lucene и искал в Интернете ответы о том, как это сделать... Но не смог найти метод, который работает, и мои попытки потерпели неудачу, не возвращая то, что я хочу.
По сути, в моей базе данных есть поля, которые представляют собой идентификаторы, соединенные запятой, эти поля являются свойствами документа Umbraco.
Например, скажем, у меня есть эти записи с этими полями:
Запись 1: relatedContents: 500,700
Запись 2: relatedContents: 500
Мой поисковый запрос относится к полям, имеющим значение 500, на данный момент он возвращает только запись 2, но когда я использую термин с подстановочными знаками, используя значение 500*, он возвращает оба из них. Это было бы хорошо, но проблема в том, что при поиске чего-то, что не требует значения.
Когда я ищу 700, он не возвращает Entry 1, а поиски WildCard в Lucene не позволяют указывать * в начале поискового запроса.
Похоже, мой запрос ищет значения, которые должны совпадать с поисковым запросом. Если бы был способ сделать запрос, по аналогии, как если бы вы использовали.Contains() для поиска подстроки в строке, я думаю, это решило бы эту проблему.
2 ответа
Лидирующий подстановочный знак НЕ поддерживается в Lucene дизайном ( ссылка)
Если ваш сайт НЕ слишком сложный, и вы можете быть уверены, что производительность НЕ является проблемой, вы можете включить ведущий шаблон enableLeadingWildcards="true"
создав собственный пользовательский поисковик вместо использования по умолчанию в Umbraco Examine:
Определите пользовательский поисковик в настройках:
<add name="CustomSearchSearcher"
type="MyNamespace.MyUmbracoExamineSearcher, MyNamespace"
analyzer="Lucene.Net.Analysis.WhitespaceAnalyzer, Lucene.Net"
enableLeadingWildcards="true"/>
Используйте RawQuery, когда вы хотите искать:
var searchProvider = ExamineManager.Instance.SearchProviderCollection["CustomSearchSearcher"];
var searchCriteria = searchProvider.CreateSearchCriteria();
searchProvider.Search(searchCriteria.RawQuery("relatedContents:*700*));
Я не думаю, что помеченный ответ решит вашу проблему. Вам следует изучить анализатор, который вы используете.
Если вы используете KeywordAnalyzer, строка индексируется как есть, с запятой, и вам придется использовать *, но если вы используете стандартный анализатор, строка разбивается на разные термины для вашего поля, поэтому 500 или 700 должны найти ваш узел.
Если вам нужен KeywordAnalyser для вашего индекса, вы можете указать другой анализатор для этого поля. для этого вам придется работать напрямую с Lucene, а не с Examine, и использовать PerFieldAnalyserWrapper