C# Lucene.net找不到正确的匹配项
我是lucene.net的新手,在一些搜索中,我发现我可以在我的项目中使用lucene 现在我无法修复代码中的错误 让我用代码解释一下 首先,我创建了如下索引C# Lucene.net找不到正确的匹配项,c#,lucene.net,C#,Lucene.net,我是lucene.net的新手,在一些搜索中,我发现我可以在我的项目中使用lucene 现在我无法修复代码中的错误 让我用代码解释一下 首先,我创建了如下索引 var strIndexDir = path; Directory indexDir = FSDirectory.Open(new DirectoryInfo(strIndexDir)); Analyzer std = new StandardAnalyzer(global::Lucene.
var strIndexDir = path;
Directory indexDir = FSDirectory.Open(new DirectoryInfo(strIndexDir));
Analyzer std = new StandardAnalyzer(global::Lucene.Net.Util.Version.LUCENE_30)
foreach (var res in resturant)
{
var doc = new Document();
restaurantName = new Field("Name",
res.Name, Field.Store.YES,
Field.Index.ANALYZED, Field.TermVector.YES);
var restaurantId = new Field("Id",
res.RestaurantId.ToString(), Field.Store.YES,
Field.Index.NO, Field.TermVector.NO);
var restaurantSlug = new Field("Slug",
res.Slug, Field.Store.YES,
Field.Index.NO, Field.TermVector.NO);
var restaurantAddress = new Field("Address",
res.Address ?? "empty", Field.Store.YES,
Field.Index.NOT_ANALYZED, Field.TermVector.YES);
var resturantType = new Field("Type",
"restaurant", Field.Store.YES,
Field.Index.NO, Field.TermVector.NO);
doc.Add(restaurantName);
doc.Add(restaurantId);
doc.Add(restaurantSlug);
doc.Add(restaurantAddress);
doc.Add(resturantType);
idxw.AddDocument(doc);
}
idxw.Optimize();
idxw.Close();
我认为我自己的索引是可以的,因为我只想找到餐厅的名称和地址
对于搜索查询,我也使用这种方式
string strIndexDir = path;
Analyzer std = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);
var indexReader = IndexReader.Open(FSDirectory.Open(path), readOnly: true);
var parserName =
new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_30, "Name", std);
var parserAddress =
new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_30, "Address", std);
var parserSlug =
new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_30, "Slug", std);
var parserTitle =
new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_30, "Title", std);
var searcher = new IndexSearcher(FSDirectory.Open(path));
using (var srchr = new IndexSearcher(IndexReader.Open(directory,true)))
{
var qryName = parserName.Parse(q);
var qryAddress = parserAddress.Parse(q);
var qrySlug = parserSlug.Parse(q);
var qrytitle = parserTitle.Parse(q);
var cllctr = TopScoreDocCollector.Create(10, true);
searcher.Search(qryName, cllctr);
searcher.Search(qryAddress, cllctr);
searcher.Search(qrySlug, cllctr);
searcher.Search(qrytitle, cllctr);
var hits = cllctr.TopDocs().ScoreDocs;
现在让我说问题出在哪里
例如,我搜索这个关键字(q=“box”)希望找到餐厅名称,名称为boxshaharkgharb,并希望使用“box”
问题是hot始终为0,但当我键入boxshaharkgharb(例如,q=“boxshaharkgharb”)时,结果是正常的
通过使用通配符,你可以强制Lucene按片段进行搜索
如果您需要对所有查询执行此操作,您需要查看您的选择,因为Lucene使用整词搜索的性能最好。原因是,默认情况下,通配符变成了常数分数查询,而术语搜索使用相关性对结果进行排名。非常感谢@Giedrius,你能给我解释一下吗?我需要植入代码来理解自从我使用Lucene以来已经有一段时间了,但若我没记错的话,简单地将查询写成
box*
应该会得到您想要的结果。如果您不希望强制用户编写*,您可以自行添加它,如下面的回答:非常感谢@Giedrius,我可以问您lucene支持通配符的版本吗?从我在这里读到的内容来看:它肯定会在2.1版本之后得到支持。