繁体   English   中英

在Lucene中使字段不区分大小写

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM