Lucene составной запрос поиска - PullRequest
1 голос
/ 21 марта 2011

Я хочу запросить индекс люцены с некоторым пересечением на нем.

Данные:

ПОЛЯ ПОЛЯ1 ПОЛЯ2 ПОЛЯ3
ROW ID1 VALUE1 VALUE2
ROW ID2 VALUE3 VALUE4
ROW ID3 VALUE4 VALUE5
ROW ID3 VALUE6 VALUE5

Запрос: (ПОЛЕ2: ЗНАЧЕНИЕ 4 И ПОЛЕ3: ЗНАЧЕНИЕ5) (ПЕРЕКРЫТЬ НА ПОЛЕ1) (ПОЛЕ2: ЗНАЧЕНИЕ 4 И ПОЛЕ3: ЗНАЧЕНИЕ5)

Так что мой окончательный результат должен быть ID3.

Любой вклад будет очень полезен.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 21 марта 2011

Позвольте мне добавить еще несколько данных.

PRODUCT_ID|HEADER_ID|HEADER_VALUE

PRODUCT_01|HEADER_01|XYZ
PRODUCT_02|HEADER_02|XYZ
PRODUCT_02|HEADER_03|ABC
PRODUCT_03|HEADER_03|ABC

Теперь предположим, что из моего пользовательского интерфейса я выбираю заголовки как:

HEADER_02 со значением XYZ

и

HEADER_03 со значением ABC

В идеале я должен получить (ожидаемый продукт, которому соответствуют header_id 02, 03 со значением XYZ, ABC) PRODUCT_02.И я действительно не знаю о продукте в запросе.

Если я сделаю запрос с помощью OR, я получу PRODUCT_02, а также PRODUCT_03, что будет неправильно.Если я сделаю запрос с AND, я ничего не получу, потому что Lucene работает по принципу «один документ за один раз».

Надеюсь, на этот раз моя проблема носит описательный характер.

Это для вашего ответа.:)

0 голосов
/ 21 марта 2011

Я не понимаю, что вы пытаетесь сделать, там нет пересечения

, если вы хотите спросить, как мне выполнить сложный поиск (И) в индексе люцены, см. Ниже

TermQuery tq1= new TermQuery(new Term("VALUE4", FIELD2));
TermQuery tq2= new TermQuery(new Term("VALUE5", FIELD3));
// BooleanClauses Enum SHOULD says Use this operator for clauses that should appear in the matching documents.
BooleanQuery bq = new BooleanQuery();
bq.add(tq1,BooleanClause.Occur.SHOULD);
bq.add(tq2,BooleanClause.Occur.SHOULD);
IndexSearcher searcher = new IndexSearcher(index, true);
TopScoreDocCollector collector = TopScoreDocCollector.create(10, true);
//Iterate Collector hits
//process HitCollector or whatever terms, results,etc

РЕДАКТИРОВАТЬ:

//Parser meant for  using all the fields used for search
 MultiFieldQueryParser multiQueryParser = new MultiFieldQueryParser(
    searchFields, ANALYZER_NAME);
  multiQueryParser.setDefaultOperator(QueryParser.AND_OPERATOR);

 //You need to build something like this

 Query query1 = new TermQuery(HEADER,"HEADER_01");
 Query query2 = new TermQuery(XYZ_FIELD,"XYZ");

 Query query3 = new TermQuery(HEADER,"HEADER_02");
 Query query4 = new TermQuery(XYZ_FIELD,"ABC");

 BooleanQuery booleanQuery = new BooleanQuery();
booleanQuery.add(query1, BooleanClause.Occur.MUST);
booleanQuery.add(query2, BooleanClause.Occur.MUST);

 booleanQuery.add(query3, BooleanClause.Occur.MUST);
booleanQuery.add(query4, BooleanClause.Occur.MUST);

 //Search the index
...