6

我对 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);

现在当用户搜索时,用户可以输入像 奥迪宝马ECU这样的数据

1)第一次我希望像[Audi] [BMW] [ECU]这样的每个单词都应该搜索我索引的字段,例如 title,description,url 。每个单词都应针对名为title,description,url的 3 个字段进行搜索。所以我需要做什么。我需要写什么代码。

2) 第二次“ Audi BMW ECU ”应该是针对标题、描述、url字段进行搜索。

3) 用户在搜索Audi BMW ECU * 或Audi BMW ECU时可以使用输入通配符吗? 4)我想添加模糊搜索以及多词搜索,所以如果用户拼写错误,结果也会出现。

请指导我如何在我的代码和例程中整合所有逻辑和功能,因为我得到了各种用户输入的结果。

如果可能的话,详细讨论这个问题。

4

1 回答 1

13

您可以使用QueryParser该类将用户提供的查询解析为 LuceneQuery对象树。还有一个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”。还有其他几种查询类型可用,例如邻近搜索和词条提升。查询解析器语法文档中提供了所有内容。

添加功能以帮助用户使用拼写错误的单词是一项更大的任务。您可以将查询重写为模糊搜索,但这会禁用任何启用的分析器(因此您拥有的任何词干)。您还可以通过将查询重写为具有更多匹配项的类似查询来尝试不同的“你是不是故意的”解决方案。这里有很多实验。

于 2012-08-22T18:13:38.447 回答