Lucene.NET 4.8 搜索不返回结果
Lucene.NET 4.8 search not returning results
从 Lucene 3.X 升级到 4.8 后,必须重写一些内容才能使所有功能再次正常运行。
我尝试了来自不同教程的多个完整解决方案(针对我们的情况进行了调整),以及许多不同的调整和测试,但我无法找到下面代码的实际问题所在。
从代码开始
将字段从通用类型更改为特定字符串类型后,将字段添加到文档的代码现在如下所示
Document document = new Document
{
new StringField("productName", product.Name, Field.Store.YES),
new StringField("productDescription", product.Description, Field.Store.YES),
new StringField("productCategory", product.Category, Field.Store.YES)
};
代码的搜索部分如下所示:
Analyzer analyzer = new StandardAnalyzer(Version);
IndexReader reader = DirectoryReader.Open(indexDirectory);
IndexSearcher searcher = new IndexSearcher(reader);
MultiFieldQueryParser parser = new MultiFieldQueryParser(Version,
new[] { "productName", "productCategory", "productDescription" },
analyzer,
new Dictionary<string, float> {
{ "productName", 20 },
{ "productCategory", 5 },
{ "productDescription", 1 }
}
);
ScoreDoc[] hits = searcher.Search(parser.Parse(searchTerm))?.ScoreDocs;
问题
当仅使用通配符搜索时,搜索正确 returns 所有内容,因此索引部分似乎工作正常。
但是,如果我尝试使用任何搜索词查找以下产品,则什么也找不到。
示例产品信息
- 姓名:Tafelrok
- 描述:Tafelrok
- 类别:Tafels & Stoelen
我试过 'Tafelrok'、'tafelrok'、'Tafel'、'tafel'、'afel'、'afe' 等最后一个词应该部分命中所有 3 个字段,而第一个是针对多个字段的完全匹配。
我也试过更改 parser.Parse(searchTerm) 位以包含通配符 ("" + searchTerm + ""),但没有任何变化。
我显然遗漏了一些东西,知道为什么搜索失败了吗?
您需要适当地配置您的字段,选择正确的分析器进行索引和搜索,并使用正确的查询语法。
文档 StringField
实例是一种关键字,它们没有被分析,它们按原样编入索引(在它的原始情况下)。但是 StandardAnalyzer
将小写过滤器应用于查询。您可以通过在查询解析器中使用 KeywordAnalyzer
来解决此问题。如果需要分析字段(例如产品描述),您可以使用 TextField
。最后,为了匹配部分术语,您需要使用通配符(*
或 ?
)。
更多信息请查看:
- Analyzers in Lucene.Net 亚伦鲍威尔的文章
- 将 IndexableFieldType 与 Apache Lucene Migration Guide
的 Field 实例部分分开
- Lucene field, StringField vs TextField
- Solr Text field and String field - different search behaviour 关于 Whosebug 的讨论
- Apache Lucene - Query Parser Syntax 文档页面
- Document search on partial words 关于 Whosebug 的讨论
从 Lucene 3.X 升级到 4.8 后,必须重写一些内容才能使所有功能再次正常运行。
我尝试了来自不同教程的多个完整解决方案(针对我们的情况进行了调整),以及许多不同的调整和测试,但我无法找到下面代码的实际问题所在。
从代码开始
将字段从通用类型更改为特定字符串类型后,将字段添加到文档的代码现在如下所示
Document document = new Document
{
new StringField("productName", product.Name, Field.Store.YES),
new StringField("productDescription", product.Description, Field.Store.YES),
new StringField("productCategory", product.Category, Field.Store.YES)
};
代码的搜索部分如下所示:
Analyzer analyzer = new StandardAnalyzer(Version);
IndexReader reader = DirectoryReader.Open(indexDirectory);
IndexSearcher searcher = new IndexSearcher(reader);
MultiFieldQueryParser parser = new MultiFieldQueryParser(Version,
new[] { "productName", "productCategory", "productDescription" },
analyzer,
new Dictionary<string, float> {
{ "productName", 20 },
{ "productCategory", 5 },
{ "productDescription", 1 }
}
);
ScoreDoc[] hits = searcher.Search(parser.Parse(searchTerm))?.ScoreDocs;
问题
当仅使用通配符搜索时,搜索正确 returns 所有内容,因此索引部分似乎工作正常。 但是,如果我尝试使用任何搜索词查找以下产品,则什么也找不到。
示例产品信息
- 姓名:Tafelrok
- 描述:Tafelrok
- 类别:Tafels & Stoelen
我试过 'Tafelrok'、'tafelrok'、'Tafel'、'tafel'、'afel'、'afe' 等最后一个词应该部分命中所有 3 个字段,而第一个是针对多个字段的完全匹配。
我也试过更改 parser.Parse(searchTerm) 位以包含通配符 ("" + searchTerm + ""),但没有任何变化。
我显然遗漏了一些东西,知道为什么搜索失败了吗?
您需要适当地配置您的字段,选择正确的分析器进行索引和搜索,并使用正确的查询语法。
文档 StringField
实例是一种关键字,它们没有被分析,它们按原样编入索引(在它的原始情况下)。但是 StandardAnalyzer
将小写过滤器应用于查询。您可以通过在查询解析器中使用 KeywordAnalyzer
来解决此问题。如果需要分析字段(例如产品描述),您可以使用 TextField
。最后,为了匹配部分术语,您需要使用通配符(*
或 ?
)。
更多信息请查看:
- Analyzers in Lucene.Net 亚伦鲍威尔的文章
- 将 IndexableFieldType 与 Apache Lucene Migration Guide 的 Field 实例部分分开
- Lucene field, StringField vs TextField
- Solr Text field and String field - different search behaviour 关于 Whosebug 的讨论
- Apache Lucene - Query Parser Syntax 文档页面
- Document search on partial words 关于 Whosebug 的讨论