Sitecore:在lucene搜索期间排除项目

时间:2013-06-05 08:26:21

标签: lucene sitecore

如何在lucene搜索期间使用ADC来排除不需要的项目? (鉴于我有几百万件物品) 鉴于不需要的项目不时有所不同,因此,我无法使用配置文件将其排除。

2 个答案:

答案 0 :(得分:4)

根据我的理解,您希望能够手动设置一些排除在搜索结果中的项目。

最简单的解决方案是在基本模板中添加一些Exclude布尔标志,并在搜索项目时检查此标志。

另一种解决方案是为搜索中排除的项目创建一个包含multilist字段的设置页面,然后将所选项目的ID传递给搜索查询,将其排除在搜索范围之外。

答案 1 :(得分:3)

下面是一个非常广泛的概述,你需要做些什么才能实现这一目标。它的作用是防止在sitecore中检查了复选框字段的项目甚至被索引。对不起,这不容易!

要求:高级数据库抓取工具:http://marketplace.sitecore.net/en/Modules/Search_Contrib.aspx

1)在sitecore的基本模板中添加一个复选框字段,标题为“从搜索中排除”或其他任何内容。

2)创建将索引新字段的自定义索引搜寻器。

namespace YourNamespace
{
    class MyIndexCrawler : Sitecore.SharedSource.SearchCrawler.Crawlers.AdvancedDatabaseCrawler
    {
        protected override void AddSpecialFields(Lucene.Net.Documents.Document document, Sitecore.Data.Items.Item item)
        {
            base.AddSpecialFields(document, item);

            document.Add(CreateValueField("exclude from search",
                string.IsNullOrEmpty(item["Exclude From Search"]) 
                ? "0" 
                : "1"));

3)配置Lucene使用新的自定义索引搜寻器(如果您不使用包含,则为Web.config)

<configuration>
  <indexes hint="list:AddIndex">
    ...
    <locations hint="list:AddCrawler">
      <master type="YourNameSpace.MyIndexCrawler,YourNameSpace">
        <Database>web</Database>
        <Root>/sitecore/content</Root>
        <IndexAllFields>true</IndexAllFields>

4)配置您的搜索查询

var excludeQuery = new BooleanQuery();
Query exclude = new TermQuery(new Term("exclude from search", "0"));
excludeQuery.Add(exclude, BooleanClause.Occur.MUST);

5)获取搜索结果

var db = Sitecore.Context.Database;
var index = SearchManager.GetIndex("name_of_your_index"); // I use db.Name.ToLower() for my master/web indexes
var context = index.CreateSearchContext();
var searchContext = new SearchContext(db.GetItem(rootItem));

var hits = context.Search(excludeQuery, searchContext);

注意:您可以在此处使用合并查询,以便在搜索时获得更大的灵活性!