如何在 lucene 搜索期间使用 ADC 排除不需要的项目?(鉴于我有几百万个项目)鉴于不需要的项目有时会有所不同,因此,我无法使用配置文件将其排除。
问问题
1631 次
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 回答