Lucene.NET搜索索引方法

时间:2010-03-30 22:22:58

标签: c# asp.net search lucene.net

我正在尝试整理一个在我们的某个网站上使用Lucene.NET的测试用例。我想做以下事情:

单个唯一ID中的索引。 以逗号分隔的术语或标签字符串编制索引。

例如。

第1项: Id = 1 Tags = Something,Separated-Term

然后,我将构建搜索结构,以便我可以查找针对标记的文档,即

标签:OR标签:单独的术语

我需要维护确切的术语值才能搜索它。

我有一些正在运行的东西,正在按预期解析搜索查询,但我没有看到任何结果。这是一些代码。

我的解析器(_luceneAnalyzer传递到我的索引服务中):

var parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_CURRENT, "Tags", _luceneAnalyzer);
parser.SetDefaultOperator(QueryParser.Operator.AND);
return parser;

我的Lucene.NET文档创建:

var doc = new Document();

var id = new Field(
    "Id",
    NumericUtils.IntToPrefixCoded(indexObject.id),
    Field.Store.YES,
    Field.Index.NOT_ANALYZED,
    Field.TermVector.NO);

var tags = new Field(
    "Tags",
    string.Join(",", indexObject.Tags.ToArray()),
    Field.Store.NO,
    Field.Index.ANALYZED,
    Field.TermVector.YES);

doc.Add(id);
doc.Add(tags);

return doc;

我的搜索:

var parser = BuildQueryParser();
var query = parser.Parse(searchQuery);
var searcher = Searcher;

TopDocs hits = searcher.Search(query, null, max);
IList<SearchResult> result = new List<SearchResult>();
float scoreNorm = 1.0f / hits.GetMaxScore();

for (int i = 0; i < hits.scoreDocs.Length; i++)
{
    float score = hits.scoreDocs[i].score * scoreNorm;
    result.Add(CreateSearchResult(searcher.Doc(hits.scoreDocs[i].doc), score));
}

return result;

我的索引中有两个文档,一个标记为“Something”,另一个标记为“Something”和“Separated-Term”。重要的是 - 保留在条款中,因为我希望与完整值完全匹配。

当我搜索“tags:Something”时,我没有得到任何结果。

问题

我应该使用什么分析器来实现我追求的搜索索引? 是否有任何指针可以将这样的搜索组合在一起? 为什么我当前的搜索没有返回任何结果?

非常感谢

2 个答案:

答案 0 :(得分:0)

要考虑一些想法:

  1. 尝试搜索“Tags:Something”(您在示例中小写了字段名称“Tags”)
  2. 我认为你需要一个每个字段的分析器:一个用于“Id”,一个用于“Tags
  3. Luke是一个非常好的检查索引和查询的工具(它适用于Lucene.net创建的数据)
  4. 希望这有帮助,

答案 1 :(得分:0)

看来您可以为文档添加多个具有相同名称的字段,因此我将代码更改为:

foreach (string tag in vehicle.Tags)
{
    var tags = new Field(
        TAGS,
        tag,
        Field.Store.YES,
        Field.Index.ANALYZED,
        Field.TermVector.YES);

    doc.Add(tags);
}

我现在可以在“标签”字段中按单个或多个标签进行搜索。