Поиск Lucene LongPoint Range не работает

Я использую Lucene 8.2.0 в Java 11.

Я пытаюсь проиндексировать значение Long, чтобы я мог фильтровать его с помощью запроса диапазона, например, так: +my_range_field:[1 TO 200]. Однако любой вариант этого, даже my_range_field:[* TO *], возвращает 0 результатов в этом минимальном примере. Как только я удаляю из него +, чтобы сделать его OR, я получаю результаты 2.

Поэтому я думаю, что должен ошибиться в том, как я его индексирую, но я не могу понять, что это может быть.

Из LongPoint JavaDoc:

Индексированное длинное поле для фильтров быстрого диапазона. Если вам также необходимо сохранить значение, вы должны добавить отдельный экземпляр StoredField. Поиск всех документов в N-мерной форме или диапазоне во время поиска эффективен. Допускается использование нескольких значений для одного и того же поля в одном документе.

Это мой минимальный пример:

public static void main(String[] args) {
    Directory index = new RAMDirectory();
    StandardAnalyzer analyzer = new StandardAnalyzer();

    try {
        IndexWriter indexWriter = new IndexWriter(index, new IndexWriterConfig(analyzer));

        Document document1= new Document();
        Document document2= new Document();

        document1.add(new LongPoint("my_range_field", 10));
        document1.add(new StoredField("my_range_field", 10));
        document2.add(new LongPoint("my_range_field", 100));
        document2.add(new StoredField("my_range_field", 100));

        document1.add(new TextField("my_text_field", "test content 1", Field.Store.YES));
        document2.add(new TextField("my_text_field", "test content 2", Field.Store.YES));

        indexWriter.deleteAll();
        indexWriter.commit();
        indexWriter.addDocument(document1);
        indexWriter.addDocument(document2);
        indexWriter.commit();
        indexWriter.close();

        QueryParser parser = new QueryParser("text", analyzer);
        IndexSearcher indexSearcher = new IndexSearcher(DirectoryReader.open(index));

        String luceneQuery = "+my_text_field:test* +my_range_field:[1 TO 200]";
        Query query = parser.parse(luceneQuery);

        System.out.println(indexSearcher.search(query, 10).totalHits.value);
    } catch (IOException e) {

    } catch (ParseException e) {

    }
}

person Yanick Nedderhoff    schedule 26.06.2020    source источник


Ответы (1)


Я нашел решение своей проблемы.

У меня сложилось впечатление, что синтаксический анализатор запросов может просто правильно проанализировать любую строку запроса. Кажется, это не так.

С использованием

Query rangeQuery = LongPoint.newRangeQuery("my_range_field", 1L, 11L);
Query searchQuery = new WildcardQuery(new Term("my_text_field", "test*"));
Query build = new BooleanQuery.Builder()
    .add(searchQuery, BooleanClause.Occur.MUST)
    .add(rangeQuery, BooleanClause.Occur.MUST)
    .build();

вернул правильный результат.

person Yanick Nedderhoff    schedule 26.06.2020