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 ]

Может работать, но по всем неправильным причинам.

Другие вопросы по тегам