Lucene 2.4.0 Range Query не работает должным образом
Ниже приведены проиндексированные поля со значением:
EffectiveDate="1970"
ExpirationDate="2035"
Код для создания индекса и поиска:
public class IndexTest{
static Analyzer analyzer = new StandardAnalyzer();
static IndexSearcher isearcher;
@BeforeClass
public static void createIndex() throws CorruptIndexException, LockObtainFailedException, IOException{
Store s = Field.Store.YES;
Store ds = Field.Store.YES;
Index IA = Field.Index.ANALYZED;
Index INA = Field.Index.NOT_ANALYZED;
IndexWriter iwriter = new IndexWriter("C://tmp/testindex/sample", analyzer, true);
iwriter.setMaxFieldLength(25000);
//Sample dummy docs
Document doc = new Document();
Document doc1 = new Document();
Document doc2 = new Document();
Document doc3 = new Document();
doc.add(new Field("EffectiveDate", "1970", ds, IA));
doc.add(new Field("ExpirationDate", "2035", ds, IA));
iwriter.addDocument(doc);
doc1.add(new Field("EffectiveDate", "1970", ds, IA));
doc1.add(new Field("ExpirationDate", "2035", ds, IA));
iwriter.addDocument(doc1);
iwriter.optimize();
iwriter.close();
}
@Test
public void testRangeQuery() throws java.text.ParseException, Exception, IOException{
isearcher = new IndexSearcher("E://tmp/testindex/sample");
// String rQuery = " EffectiveDate : [* TO 1971 ]";
// String rQuery = " EffectiveDate : [1960 TO 2000]";
// String rQuery = " ExpirationDate : [2000 TO 2050]";
//Below Query is Not Working
String rQuery = " ExpirationDate : [2000 TO *]";
MultiFieldQueryParser parser = new MultiFieldQueryParser(
new String[] {
"EffectiveDate"
,"ExpirationDate"}, analyzer);
//parser.setDefaultOperator(QueryParser.Operator.OR);
parser.setAllowLeadingWildcard(true);
Query query = parser.parse(rQuery);
System.out.println("Str = "+rQuery);
System.out.println("query = "+query);
Hits hits = isearcher.search(query);
assertEquals(2, hits.length());
for (int i = 0; i < hits.length(); i++) {
Document hitDoc = hits.doc(i);
System.out.println("hitDoc = "+hitDoc);
System.out.println(hitDoc.get("Code"));
}
System.out.println("1query = "+query);
}
Логика:- текущая дата должна быть между этими двумя полями.
Запрос ниже диапазона работает:-
EffectiveDate : [ * TO 2013-06-26 ]
Запрос ниже диапазона не работает:-
ExpirationDate : [2013-06-26 TO *]
Любая помощь будет весьма заметна. Заранее спасибо
2 ответа
Запрос ниже диапазона Решил мою проблему: -
ExpirationDate: [2013-06-26 TO null]
Основной анализатор запросов Lucene не принимает открытые диапазоны (например, ExpirationDate : [2013-06-26 TO *]
) до версии 3.6 (см. соответствующий тикет).
Ваш ответ об использовании ExpirationDate : [2013-06-26 TO null]
может ввести вас в заблуждение null
не рассматривается как особая ценность, а просто слово! Лексикографически, пунктуация (*
) перед цифрами 2013
и цифры перед буквами (null
) (Описано очень обобщенно, я полагаю, что упорядочение основано на значении Unicode).
Так что пока ExpirationDate : [2013-06-26 TO null]
а также EffectiveDate : [ * TO 2013-06-26 ]
Работай,
ни ExpirationDate : [2013-06-26 TO *]
ни EffectiveDate : [null TO 2013-06-26 ]
будут.
В версии 2.4.0, что вам нужно сделать, чтобы обеспечить ваш поиск, - это найти достаточно высокие и низкие значения, чтобы считать поиск эффективным открытым для всех целей и задач, таких как:
+EffectiveDate : [0000-01-01 TO 2013-06-26 ] +ExpirationDate : [2013-06-26 TO 9999-12-31]
Используя что-то вроде:
+ExpirationDate : [2013-06-26 TO null] +EffectiveDate : [ * TO 2013-06-26 ]
Может работать, но по всем неправильным причинам.