匹配数据 Lucene.net
Matching data with Lucene.net
我正在尝试将一个术语与我数据库中的产品列表相匹配。让我们用一些简单的数据启动 lucene:
//Table Products
Glue
Glue Sticks
Crayons
Markers
这是棘手的部分:我正在尝试匹配最佳结果,但可能涉及垃圾数据(在字符串的后面)。让我举个例子:
如果我搜索 Glue Sticks are the best type of Grapefruit
,我希望它匹配 Glue Sticks
。现在,它匹配 Glue
作为我的最高结果。这是我的代码:
索引:
using (
IndexWriter writer = new IndexWriter(FSDirectory.Open("index"), new CaseInsensitiveKeywordAnalyzer(),
true, IndexWriter.MaxFieldLength.LIMITED))
{
foreach (var product in DB.Products.OrderBy(c => c.Id).AsEnumerable())
{
var doc = new Document();
doc.Add(new Field("Id", product.Id, Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add(new Field("Name", product.Name, Field.Store.YES, Field.Index.ANALYZED,
Field.TermVector.WITH_POSITIONS_OFFSETS));
writer.AddDocument(doc);
}
writer.Optimize();
writer.Commit();
}
搜索:
var qp = new QueryParser(Version.LUCENE_30, "Name", new SimpleAnalyzer());
var q = qp.Parse(productName);
var hits = searcher.Search(q, 10);
有没有人推荐我可以使用的其他分析器,或者更好的方法来处理此搜索?理想情况下,我希望它能在更接近开始时提升条款,因为垃圾将始终跟随我正在寻找的产品(从来没有)。
在索引文档和搜索时尝试使用 SimpleAnalyzer
。在您有充分的理由不这样做之前,在索引时和查询时保持相同的分析通常是个好主意。
using (
IndexWriter writer = new IndexWriter(FSDirectory.Open("index"), new SimpleAnalyzer(),
true, IndexWriter.MaxFieldLength.LIMITED))
使用关键字分析器,您在该字段中只有一个术语:glue sticks
。那么您的 simpleAnalyzed 查询具有以下条款:
glue
、sticks
、are
、the
、best
、type
、of
和 grapefruit
。
None 其中实际上是单个术语的匹配项:glue sticks
.
我正在尝试将一个术语与我数据库中的产品列表相匹配。让我们用一些简单的数据启动 lucene:
//Table Products
Glue
Glue Sticks
Crayons
Markers
这是棘手的部分:我正在尝试匹配最佳结果,但可能涉及垃圾数据(在字符串的后面)。让我举个例子:
如果我搜索 Glue Sticks are the best type of Grapefruit
,我希望它匹配 Glue Sticks
。现在,它匹配 Glue
作为我的最高结果。这是我的代码:
索引:
using (
IndexWriter writer = new IndexWriter(FSDirectory.Open("index"), new CaseInsensitiveKeywordAnalyzer(),
true, IndexWriter.MaxFieldLength.LIMITED))
{
foreach (var product in DB.Products.OrderBy(c => c.Id).AsEnumerable())
{
var doc = new Document();
doc.Add(new Field("Id", product.Id, Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add(new Field("Name", product.Name, Field.Store.YES, Field.Index.ANALYZED,
Field.TermVector.WITH_POSITIONS_OFFSETS));
writer.AddDocument(doc);
}
writer.Optimize();
writer.Commit();
}
搜索:
var qp = new QueryParser(Version.LUCENE_30, "Name", new SimpleAnalyzer());
var q = qp.Parse(productName);
var hits = searcher.Search(q, 10);
有没有人推荐我可以使用的其他分析器,或者更好的方法来处理此搜索?理想情况下,我希望它能在更接近开始时提升条款,因为垃圾将始终跟随我正在寻找的产品(从来没有)。
在索引文档和搜索时尝试使用 SimpleAnalyzer
。在您有充分的理由不这样做之前,在索引时和查询时保持相同的分析通常是个好主意。
using (
IndexWriter writer = new IndexWriter(FSDirectory.Open("index"), new SimpleAnalyzer(),
true, IndexWriter.MaxFieldLength.LIMITED))
使用关键字分析器,您在该字段中只有一个术语:glue sticks
。那么您的 simpleAnalyzed 查询具有以下条款:
glue
、sticks
、are
、the
、best
、type
、of
和 grapefruit
。
None 其中实际上是单个术语的匹配项:glue sticks
.