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