如何在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);
}
答案 0 :(得分:5)
字段名称区分大小写。据我所知,没有开关可以翻转以便制作它们。
可能最合理的方法是确保在索引文档时,所有字段名称都是小写的。然后,在查询时,如果您没有查询任何区分大小写的字段,则可以使用String.toLowercase()
,使整个查询字符串也小写,从而有效地使其不区分大小写。
答案 1 :(得分:-1)
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)));