Я собираюсь наградить +100 на этот вопрос, когда это возможно, даже если он уже получен и принят
Я использую Lucene 3.2, вот что у меня есть в моем индексе икод:
- Более 10 полей для каждого проиндексированного документа.
OR
операнд в фразе запроса (т. е. «мой поиск в lucene» означает «мой поиск ИЛИ lucene ИЛИ»). MultiFieldQueryParser
с Occur.SHOULD
во всех полях. - Специальное поле по умолчанию , содержащее все остальные поля (как предлагается в этом решении Как это сделатьмультиполе - поиск фраз в Lucene? ).
Чего я пытаюсь достичь?Что-то вроде Google-подобного поиска, позвольте мне объяснить:
- Поиск по всем полям
- Забитые результаты (с повышением для определенных полей и т. Д.)
- Добавление слов в фразу запроса должно filter results
Я рассматриваю все аспекты, кроме этого.У меня следующие проблемы:
- Если я выполняю поиск только в поле default , содержащем все остальные поля, я не получаю хорошие результаты
- Поисктолько с операндом AND я получаю слишком отфильтрованные результаты, получая только те, у которых в одном поле есть фраза запроса целом .
- Поиск только с операндом ИЛИ прекрасно работает только с одним словом взапрос, но при добавлении большего количества слов к фразе запроса результаты значительно возрастают вместо того, чтобы фильтровать (как это делает Google).
- Я не знаю какчтобы отфильтровать один запрос от другого
Это мой фактический вызов парсера запросов:
MultiFieldQueryParser.parse(
Version.LUCENE_31,
OrQueryWords, //query words separated with OR operand
searchFields, //String[] searchFields; // all fields
occurs, //Occur[] occurs; {Occur.SHOULD, Occur.SHOULD, etc..}
getFullTextSession().getSearchFactory().getAnalyzer(Product.class)
);
toString()
этого запроса выводит что-то вроде этого:
(field1:"word1 word2" (field1:word1 field1:word2)) (field2:"word1 word2" (...)) etc.
Сейчас я пытаюсь добавить поле default (поле, содержащее все остальные поля) со словами запроса, разделенными операндом AND и Occur.MUST
:
MultiFieldQueryParser.parse(
Version.LUCENE_31,
AndQueryWords, //query words separated with AND operand
new String[] {"defaultField"},
new Occur[] {Occur.MUST},
getFullTextSession().getSearchFactory().getAnalyzer(Product.class)
);
* * * toString()
этого запроса печатает это:
+(default:"word1 word2" (+default:word1 +default:word2))
Как я могу пересечь оба запроса?Есть ли другое решение, чтобы достичь этого?