2013-09-09 2 views
0

Я использую Examine в Umbraco для запроса индекса содержимого Lucene. У меня есть поле «completeNodeText», которое является конкатенацией всех свойств узла (чтобы все было просто, а не поиск по нескольким полям).Изучите пользовательский запрос lucene.net после анализатора tokenizes

Я принимаю пользовательские условия поиска. Когда поисковый термин представляет собой несколько слов (т. Е. «Firstterm secondterm»), я хочу, чтобы результирующий запрос был запросом OR: верните результаты, где fullNodeText является первым или вторым.

Я хочу:

{+completeNodeText:"firstterm ? secondterm"} 

, но вместо этого, я получаю:

{+completeNodeText:"firstterm secondterm"} 

Если я ищу "firstterm ИЛИ secondterm" вместо "firstterm secondterm", то генерируется запрос правильно: {+completeNodeText:"firstterm ? secondterm"}

Я использую следующие вызовы API:

var searcher = ExamineManager.Instance.SearchProviderCollection["ExternalSearcher"]; 
var searchCriteria = searcher.CreateSearchCriteria(); 
var query = searchCriteria.Field("completeNodeText", term).Compile(); 

Есть ли простой способ заставить Examine сгенерировать этот запрос «OR»? Или мне нужно вручную построить необработанный запрос, вызвав StandardAnalyzer, чтобы токенизировать вход пользователя и объединить запрос, итерации через токены? И обойти весь аналитический API запросов Checking?

ответ

1

Я не думаю, что знак вопроса означает, что вы думаете, что это значит.

Похоже, что вы генерируете PhraseQuery, но вам нужны два непересекающихся TermQueries. В Lucene query syntax запрос фразы заключен в кавычки.

"firstterm secondterm" 

Запрос фразы ищет именно эту фразу, причем эти два члена появляются последовательно и по порядку. Размещение OR в фразовом запросе не выполняет какой-либо логической логики, а рассматривает его как слово «ИЛИ». Вопросительный знак является заполнителем, использующим в PhraseQuery.toString() для представления удаленной остановки слова (см. #Lucene-1396). Вы все еще выполняете фразерию, но теперь она ожидает трехсловую фразу firstterm, за которой следует удаленное стоп-слово, за которым следует secondterm

Чтобы просто найти два отдельных слова, избавитесь от котировок.

firstterm secondterm 

Будет искать любой документ с любым из этих условий (с более высокой оценкой, предоставляемой документам с обоими).

+0

Я не понимал, что это был запрос фразы. Я предполагаю, что я хочу, чтобы Examine генерировал запрос, который является OR каждого токена в исходном тексте, отправленном пользователем. –

+0

Но я хочу, чтобы Examine использовал StandardAnalyzer для того, чтобы токенизировать все, чтобы мне не пришлось вручную токенизировать ввод пользователя самостоятельно (путем разделения на «и отфильтровывать стоп-слова»), а затем генерировать индивидуальные запросы «ИЛИ» для каждого из эти ручные жетоны. Возможно ли, что Examine/Lucene возьмет поток токенов, а затем сгенерирует индивидуальные запросы поля OR для каждого токена? –

+0

QueryParser должен обработать это для вас. Вы читали [синтаксическую документацию запроса] (http://lucene.apache.org/core/2_9_4/queryparsersyntax.html), с которой я связан? Есть ли какая-то конкретная проблема, которую вы видите здесь? – femtoRgon

Смежные вопросы