Lucene: префиксный запрос не работает с WhitespaceAnalyzer

1

Я немного экспериментирую с объектами Query Lucene, и я пытаюсь понять, почему префиксный запрос не соответствует каким-либо документам при использовании WhitespaceAnaylzer для индексирования. Рассмотрим следующий тестовый код:

protected String[] ids = { "1", "2" };
protected String[] unindexed = { "Netherlands", "Italy" };
protected String[] unstored = { "Amsterdam has lots of bridges",
        "Venice has lots of canals" };
protected String[] text = { "Amsterdam", "Venice" };

@Test
public void testWhitespaceAnalyzerPrefixQuery() throws IOException, ParseException {
    File indexes = new File(
            "C:/LuceneInActionTutorial/indexes");

    FSDirectory dir = FSDirectory.open(indexes);

    IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_9,
            new LimitTokenCountAnalyzer(new WhitespaceAnalyzer(
                    Version.LUCENE_4_9), Integer.MAX_VALUE));
    IndexWriter writer = new IndexWriter(dir, config);

    for (int i = 0; i < ids.length; i++) {
        Document doc = new Document();
        doc.add(new StringField("id", ids[i], Store.NO));
        doc.add(new StoredField("country", unindexed[i]));
        doc.add(new TextField("contents", unstored[i], Store.NO));
        doc.add(new Field("city", text[i], TextField.TYPE_STORED));
        writer.addDocument(doc);
    }
    writer.close();

    DirectoryReader dr = DirectoryReader.open(dir);
    IndexSearcher is = new IndexSearcher(dr);
    QueryParser queryParser = new QueryParser(Version.LUCENE_4_9,
            "contents", new WhitespaceAnalyzer(Version.LUCENE_4_9));
    queryParser.setLowercaseExpandedTerms(true);
    Query q = queryParser.parse("Ven*");
    assertTrue(q.getClass().getSimpleName().contains("PrefixQuery"));
    TopDocs hits = is.search(q, 10);
    assertEquals(1, hits.totalHits);
} 

Если я заменил WhitespaceAnaylzer на StandardAnalyzer, тест пройдет. Я использовал Luke для проверки содержимого индекса, но не смог найти различий в том, как Lucene сохраняет значения во время индексации. Может кто-нибудь прояснить, что происходит?

Теги:
lucene

1 ответ

3
Лучший ответ

StandardAnalyzer уменьшает текст при индексировании. WhitespaceAnalyzer нет. Термин в индексе, где WhitespaceAnalyzer - "Венеция".

Парсер запроса setLowercaseExpandedTerms(true) строчный запрос запроса, поскольку вы установили setLowercaseExpandedTerms(true) (это также значение по умолчанию, чтобы отключить это, вам нужно явно установить его на false). Таким образом, ваш запрос "ven *", который не соответствует "Венеции".

  • 0
    Хорошо, теперь я понял. Установка значения "setLowercaseExpandedTerms" в false и замена префикса на "Ven *" работает. Большое спасибо!
  • 0
    Мне кажется неправильным, что QueryParser по умолчанию ограничивает использование терминов. Спасибо за подсказку @femtoRgon

Ещё вопросы

Сообщество Overcoder
Наверх
Меню