列使用Lucene.NET搜索时优先级

时间:2014-07-10 10:36:12

标签: lucene.net

我有6个索引列要搜索如下。

  1. 名称
  2. 描述
  3. SKU
  4. 分类
  5. 价格
  6. SearchCriteria
  7. 现在,在搜索时我需要首先在"SearchCritera"列上执行搜索,然后是其余列。

    简而言之 - 匹配“SearchCritera”的产品会显示在搜索结果的顶部。

    var parser = new MultiFieldQueryParser(Version.LUCENE_30,
        new[] { "SearchCriteria",
            "Name",
            "Description",
            "SKU",
            "Category",
            "Price"
        }, analyzer);
    var query = parseQuery(searchQuery, parser);
    
    var finalQuery = new BooleanQuery();
    finalQuery.Add(parser.Parse(searchQuery), Occur.SHOULD);
    
    var hits = searcher.Search(finalQuery, null, hits_limit, Sort.RELEVANCE);
    

1 个答案:

答案 0 :(得分:7)

有两种方法可以做到。

第一种方法是使用字段提升:

索引期间,按优先级设置字段的提升:

        Field name = new Field("Name", strName, Field.Store.NO, Field.Index.ANALYZED);
        name.Boost = 1;

        Field searchCriteria = new Field("SearchCriteria", strSearchCriteria, Field.Store.NO, Field.Index.ANALYZED);
        searchCriteria.Boost = 2;

        doc.Add(name);
        doc.Add(searchCriteria);

这样,SearchCriteria字段中的术语评分将比名称字段中的术语评分加倍。

如果您始终希望SearchCriteria比Name更重要,则此方法更好。

第二种方法是在搜索期间使用MultiFieldQueryParser提升:

Dictionary<string,float> boosts = new Dictionary<string,float>();
        boosts.Add("SearchCriteria",2);
        boosts.Add("Name",1);

        MultiFieldQueryParser parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_30new[], new[] { "SearchCriteria", "Name"}, analyzer,  boosts);

如果您希望增强仅在应用程序的某些情况下起作用,则此方法更好。

您应该尝试查看提升号码是否符合您的需求(您正在寻找的优先级的敏感度),并根据您的需要进行更改。

使示例简短易读我只使用了2个字段,但你应该使用所有字段...