2

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

4

2 回答 2

4

据我了解,您希望能够手动将某些项目设置为不显示在搜索结果中。

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

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

于 2013-06-05T08:37:47.897 回答
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);

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

于 2013-06-05T19:21:10.430 回答