Lucene.Net多字搜索多字段和外卡使用和短语搜索,模糊搜索全部

Tho*_*mas 5 c# lucene lucene.net

我是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);
Run Code Online (Sandbox Code Playgroud)

现在用户搜索时用户可以输入奥迪BMW ECU等数据

1)第一次我希望像[奥迪] [宝马] [ECU]这样的每个单词都应该搜索标题,描述,网址等索引.每个单词应该搜索3个字段,称为title,description,url.所以我需要做什么.我需要写什么代码.

2)第二次使用短语" Audi BMW ECU "来搜索标题,描述,url字段.

3)用户在搜索奥迪BMW ECU*或奥迪BMW ECU时可能会使用输入外卡吗? 4)我想添加模糊搜索和多字搜索,这样如果用户拼写错误,那么结果也会出现.

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

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

sis*_*sve 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");
Run Code Online (Sandbox Code Playgroud)

生成的查询看起来像(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\"");
Run Code Online (Sandbox Code Playgroud)

生成的查询看起来像Title:"audi bmw ecu" Description:"audi bmw ecu" Url:"audi bmw ecu".

QueryParser还支持使用*?根据需要使用通配符查询.还支持模糊搜索; "奥迪〜0.5".还有其他几种查询类型,例如邻近搜索和术语提升.Query Parser语法文档中提供了所有内容.

添加功能以帮助用户使用拼写错误的单词是一项更大的任务.您可以将查询重写为模糊搜索,但这会禁用任何启用的分析器(因此任何词干都会被禁用).您还可以通过将查询重写为具有更多匹配项的类似查询来尝试不同的"无所谓"解决方案.这里有很多可以尝试的东西.