与Lucene.net匹配的数据

时间:2015-03-12 04:01:11

标签: c# lucene 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);

是否有人推荐我可以使用的其他分析器,或者更好的方法来处理此搜索?理想情况下,我希望将条款提升到更接近开始,因为垃圾将始终遵循我正在寻找的产品(从未在之前)。

1 个答案:

答案 0 :(得分:0)

在索引文档时以及搜索时尝试使用SimpleAnalyzer。在索引和查询时间保持分析相同,通常是个好主意,直​​到您有充分的理由不这样做。

using (
    IndexWriter writer = new IndexWriter(FSDirectory.Open("index"), new SimpleAnalyzer(),
                                        true, IndexWriter.MaxFieldLength.LIMITED))

使用关键字分析器,您在该字段中只有一个词:glue sticks。然后,您的simpleAnalyzed查询具有以下术语:

gluesticksarethebesttypeof和{{1} }。

其中没有一个实际上是单个术语的匹配:grapefruit