[英]Make field case insensitive in lucene
如何使Lucene中的字段不區分大小寫? 假設我有以下文件:
用戶:xyz
現在,查詢“ user:xyz”,“ uSer:xyz”或“ usEr:xyz”的結果應返回該文檔。
可能的解決方案是在索引和搜索時降低字段的大小寫。 但是檢索文檔時我需要字段的確切值。 另外,另一種解決方案是對該字段建立兩次索引,但這也不是正確的解決方案。
這是lucene的例子。 當查詢為“ user:xyz”時,文檔不匹配。 但是,如果我使用查詢“ User:xyz”,則該文檔匹配,因為在索引時我將字段設置為“ User”。
public void testFieldCaseSensitive() throws ParseException,
QueryNodeException {
StandardQueryParser parser = new StandardQueryParser();
Query luceneQuery = parser.parse("user:xyz","");
MemoryIndex memoryIndex = new MemoryIndex();
memoryIndex.addField("User", "xyz", new StandardAnalyzer(
Version.LUCENE_43));
memoryIndex.search(luceneQuery);
Assert.assertTrue(memoryIndex.search(luceneQuery) > 0);
}
字段名稱區分大小寫。 據我所知,沒有開關可以翻轉以使它們不然。
解決此問題的最合理的方法可能是確保在索引文檔時,所有字段名稱都小寫。 然后,在查詢時,如果不針對任何區分大小寫的字段進行查詢,則可以只使用String.toLowercase()
來使整個查詢字符串都變為小寫,從而有效地使其不區分大小寫。
無論您搜索什么(區分大小寫或不區分大小寫),Apache Lucene都不區分大小寫,它將為您帶來結果。
基本上,您使用的索引已經覆蓋了它,並且在大多數情況下是StandardAnalyzer。 我剛剛測試過。
搜索:
DocSearchEngine searcher = new DocSearchEngine();
ScoreDoc[] hits = searcher.searchIndexWithQueryParser("SeArch TeXT");
List<ResStructure> resultSet = searcher.printResultList(hits);
對於索引:
writer = new IndexWriter(FSDirectory.open(new File(indexDir)),
new IndexWriterConfig(Version.LUCENE_45 ,new StandardAnalyzer(Version.LUCENE_45)));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.