Lucene - Как проиндексировать значение с помощью специальных символов - PullRequest
1 голос
/ 29 апреля 2010

Я пытаюсь проиндексировать значение, которое выглядит следующим образом:

Test (Test)

Используя StandardAnalyzer, я попытался добавить его в свой документ, используя:

Field.Store.YES, Field.Index.TOKENIZED

Когда я выполняю поиск по значению «Test (Test)», мой QueryParser генерирует следующие теги:

+Name:test +Name:test

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

Однако, если я выполняю QueryParser.Escape ('Test (Test)') при индексации моего значения, он создает условия:

[test] and [test]

Тогда, когда я выполняю поиск, такой:

 QueryParser.Escape('Test (Test)')

Я получаю те же два термина (как я и ожидал). Проблема в том, что если у меня есть два документа с именами:

Test
Test (Test)

Соответствует обоим. Если я укажу значение поиска «Test (Тест)», то я просто хочу получить второй документ. Мне любопытно, почему экранирование специальных символов не сохраняет их в созданных терминах. Есть ли альтернативный анализатор, на который я должен посмотреть? Я посмотрел на WhitespaceAnalyzer и KeywordAnalyzer. WhitespanceAnalyzer чувствителен к регистру, и KeywordAnalyzer хранит его как единое выражение:

[Test (Test)]

Это означает, что, если я выполню поиск только «Тест», я не смогу вернуть оба документа.

Есть идеи, как это реализовать? Не похоже, что это должно быть так сложно.

1 Ответ

1 голос
/ 29 апреля 2010

Если вы ищете «Test (Test)» и хотите получить документы, содержащие это точное выражение, вы должны заключить поисковое выражение в «...», чтобы Lucene знала, что вы хотите выполнить поиск по фразе.

Подробности смотрите в документации Lucene:
http://lucene.apache.org/java/3_0_1/queryparsersyntax.html#Terms

...