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

Sitecore:在lucene搜索期间排除项目,lucene,sitecore,Lucene,Sitecore,如何在lucene搜索期间使用ADC排除不需要的项目?(考虑到我有数百万件物品) 由于不需要的项目有时会不同,因此,我不可能使用配置文件将其排除。据我所知,您希望能够手动将某些项目设置为排除在搜索结果中 最简单的解决方案是在基本模板中添加一些Excludeboolean标志,并在搜索项目时检查该标志 另一种解决方案是为搜索中排除的项目创建一些带有多列表字段的设置页面,然后将所选项目的ID传递给搜索查询,将其排除在搜索之外。下面是一个非常全面的概述,介绍了您需要做些什么来实现这一点。它的作用是防止

如何在lucene搜索期间使用ADC排除不需要的项目?(考虑到我有数百万件物品)
由于不需要的项目有时会不同,因此,我不可能使用配置文件将其排除。

据我所知,您希望能够手动将某些项目设置为排除在搜索结果中

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


另一种解决方案是为搜索中排除的项目创建一些带有
多列表
字段的设置页面,然后将所选项目的ID传递给搜索查询,将其排除在搜索之外。

下面是一个非常全面的概述,介绍了您需要做些什么来实现这一点。它的作用是防止在sitecore中选中复选框字段的项目甚至被索引。对不起,这不容易

要求:高级数据库爬虫程序:

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以使用新的自定义索引爬虫程序(如果不使用includes,则为Web.config)

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);

注意:显然,您可以在这里使用组合查询来获得更大的搜索灵活性

我有多列表字段来保存所有不需要搜索的项目。但是我要如何为我不想要的项目更新lucene?只需迭代多列表值,添加一个新的
TermQuery
,其中
ID
作为键,列表中的值作为
occure
设置为
BooleanClause.occure的术语。不得
var excludeQuery = new BooleanQuery();
Query exclude = new TermQuery(new Term("exclude from search", "0"));
excludeQuery.Add(exclude, BooleanClause.Occur.MUST);
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);