我是lucene.net的新手。我使用lucene.net索引多个字段的数据。 这样我就做了索引数据
Document doc = new Document();
doc.Add(new Field("ID", oData.ID.ToString() + "_" + oData.Type, Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.Add(new Field("Title", oData.Title, Field.Store.YES, Field.Index.TOKENIZED));
doc.Add(new Field("Description", oData.Description, Field.Store.YES, Field.Index.TOKENIZED));
doc.Add(new Field("Url", oData.Url, Field.Store.YES, Field.Index.TOKENIZED));
writer.AddDocument(doc);
现在当用户搜索时,用户可以输入数据 奥迪BMW ECU
1)第一次我希望像 [奥迪] [宝马] [ECU] 这样的每个单词都要搜索标题,描述,网址等索引字段。每个单词应搜索名为 title,description,url 的3个字段。所以我需要做什么。我需要写什么代码。
2)第二次短语“ Audi BMW ECU ”应该搜索标题,描述,网址字段。
3)当用户搜索奥迪宝马 ECU *或奥迪宝马ECU?时,用户可以使用输入外卡吗? 4)我想添加模糊搜索和多字搜索,这样如果用户拼写失误,那么也会产生结果。请指导我如何将所有逻辑与音频联系起来。我的代码和例程中的功能因为我得到了所有用户输入的结果。
如果可能的话,详细讨论这个问题。
答案 0 :(得分:13)
您可以使用QueryParser
类将用户提供的查询解析为Lucene Query
对象树。还有一个MultiFieldQueryParser
,它将生成搜索多个字段的查询。这符合您的要求。
var fields = new[] { "Title", "Description", "Url" };
var analyzer = new StandardAnalyzer(Version.LUCENE_30);
var queryParser = new MultiFieldQueryParser(Version.LUCENE_30, fields, analyzer);
var query = queryParser.Parse("Audi BMW ECU");
生成的查询看起来像(Title:audi Description:audi Url:audi) (Title:bmw Description:bmw Url:bmw) (Title:ecu Description:ecu Url:ecu)
。
您可以让用户通过用引号括起短语来构建短语查询。这是Lucene中的标准查询格式。
var fields = new[] { "Title", "Description", "Url" };
var analyzer = new StandardAnalyzer(Version.LUCENE_30);
var queryParser = new MultiFieldQueryParser(Version.LUCENE_30, fields, analyzer);
var query = queryParser.Parse("\"Audi BMW ECU\"");
此生成的查询类似于Title:"audi bmw ecu" Description:"audi bmw ecu" Url:"audi bmw ecu"
。
QueryParser还支持使用*
和?
的通配符查询。还支持模糊搜索; “奥迪〜0.5”。还有其他几种查询类型,例如邻近搜索和术语提升。 Query Parser Syntax文档中提供了所有内容。
添加功能以帮助用户使用拼写错误的单词是一项更大的任务。您可以将查询重写为模糊搜索,但这会禁用任何启用的分析器(因此任何词干都会被禁用)。您还可以通过将查询重写为具有更多匹配项的类似查询来尝试不同的“无所谓”解决方案。这里有很多可以尝试的东西。