使lucene中的字段不区分大小写

时间:2014-03-18 05:56:11

标签: java solr lucene information-retrieval

如何在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);
}

2 个答案:

答案 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)));