简单包含Lucene中的查询

时间:2012-03-16 14:11:18

标签: lucene lucene.net

假设我在Lucence中存储了一个简短的未分析字段,那么有一种方法可以搜索此字段包含特定子字符串的文档。

例如,此字段值“AA-883 98/67”可与以下子字符串“883”,“98/67”,“AA-883”,“883 98”等匹配。

在查询Lucene时,我需要将其与其他过滤器结合使用。这是针对Lucene.NET 2.9

1 个答案:

答案 0 :(得分:1)

你可以使用WildCardQuery,但如果通配符以通配符(*或?)开头,那么如果你在该字段中有很多不同的术语,它将会非常慢。

这是一个简单的示例,演示如何编写WildcardQuery。它使用已弃用的东西,应该修改为使用非弃用的重载,但你应该明白这一点。

要与其他查询结合使用,您可以使用BooleanQuery类,它允许您将多个查询组合在一起。

RAMDirectory dir = new RAMDirectory();
IndexWriter iw = new IndexWriter(dir, new StandardAnalyzer());

Document doc = new Document();
doc.Add(new Field("test", "AA-883 98/67", Field.Store.YES, Field.Index.NOT_ANALYZED));
iw.AddDocument(doc);
iw.Commit();

IndexSearcher searcher = new IndexSearcher(iw.GetReader());

WildcardQuery query = new WildcardQuery(new Term("test", "*883*"));
Hits hits = searcher.Search(query);
Console.WriteLine(hits.Length());
// prints 1

query = new WildcardQuery(new Term("test", "*98/67*"));
hits = searcher.Search(query);
Console.WriteLine(hits.Length());
// prints 1

query = new WildcardQuery(new Term("test", "*AA-883*"));
hits = searcher.Search(query);
Console.WriteLine(hits.Length());
// prints 1

query = new WildcardQuery(new Term("test", "*883 98*"));
hits = searcher.Search(query);
Console.WriteLine(hits.Length());
// prints 1

Console.ReadLine();
iw.Close();
dir.Close();