简单包含 Lucene 中的查询

问题描述 投票:0回答:1

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

例如这个字段值“AA-883 98/67”可以匹配后面的子字符串“883”、“98/67”、“AA-883”、“883 98”等

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

lucene lucene.net
1个回答
0
投票

您可以使用 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();
© www.soinside.com 2019 - 2024. All rights reserved.