Я немного экспериментирую с объектами 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 сохраняет значения во время индексации. Может кто-нибудь прояснить, что происходит?
StandardAnalyzer
уменьшает текст при индексировании. WhitespaceAnalyzer
нет. Термин в индексе, где WhitespaceAnalyzer
- "Венеция".
Парсер запроса setLowercaseExpandedTerms(true)
строчный запрос запроса, поскольку вы установили setLowercaseExpandedTerms(true)
(это также значение по умолчанию, чтобы отключить это, вам нужно явно установить его на false). Таким образом, ваш запрос "ven *", который не соответствует "Венеции".