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 *] 

Любая помощь будет очень ценна. Заранее спасибо


person NaveenKumar1410    schedule 27.06.2013    source источник
comment
Можете ли вы показать, как вы индексируете эти два поля? Кроме того, что вы подразумеваете под не работает? (Слишком много попаданий? Пропущенных попаданий? Ни одного? Выдает исключение?)   -  person femtoRgon    schedule 27.06.2013
comment
Документ не найден... Но все значения документа находятся в диапазоне   -  person NaveenKumar1410    schedule 27.06.2013
comment
Итак, можете ли вы предоставить код, в котором эти поля добавляются в документ при индексации?   -  person femtoRgon    schedule 27.06.2013
comment
обновил вопрос с кодом   -  person NaveenKumar1410    schedule 28.06.2013
comment
@femtoRgon спасибо за помощь   -  person NaveenKumar1410    schedule 28.06.2013
comment
Ах! Извините, раньше не обращал внимания на вашу версию Lucene. Поддержка открытых диапазонов не была добавлена ​​в QueryParser до версии 3.6! См. мой ответ для объяснения того, почему ваш ответ работает и с чем следует быть осторожным.   -  person femtoRgon    schedule 28.06.2013


Ответы (1)


Анализатор запросов Core 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 ]

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

person femtoRgon    schedule 28.06.2013