假设我在Lucence中存储了一个简短的未分析字段,那么有一种方法可以搜索此字段包含特定子字符串的文档。
例如,此字段值“AA-883 98/67”可与以下子字符串“883”,“98/67”,“AA-883”,“883 98”等匹配。
在查询Lucene时,我需要将其与其他过滤器结合使用。这是针对Lucene.NET 2.9
答案 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();