这更像是一个澄清类型的问题,而不是关于LinqHelper.CreateQuery方法的实际问题。
所以,
该方法有3个过载。这里讨论的2是: 1.LinqHelper.CreateQuery<SearchResultItem>(searchContext, searchStringModel) 2.LinqHelper.CreateQuery<SearchResultItem>(searchContext, searchStringModel, startLocationItem) I在这里没有使用任何额外的上下文,因此使用了默认null。
现在,
为了搜索内容树中特定位置的项(例如,在特定文件夹下有1000个项),我可以使用方法1使用以下查询:
query = "location:{FOLDER_GUID};+custom:my_filed_name|bla_bla"效果很好。但是(据我从方法签名中了解到),我还应该能够使用方法2,如下所示:
SitecoreIndexableItem folderID = SitecoreIndexableItem)contextDatabase.GetItem({FOLDER_GUID});
var index = ContentSearchManager.GetIndex(new SitecoreIndexableItem(Sitecore.Context.Item));
using (var context = index.CreateSearchContext())
{
List<SearchStringModel> searchStringModel = new List<SearchStringModel>();
searchStringModel.Add(new SearchStringModel("my_field_name", "bla_bla"));
List<Sitecore.Data.Items.Item> resultItems = LinqHelper.CreateQuery(context, searchStringModel, folderID).Select(toItem => toItem.GetItem()).ToList();
}问题在于,对于上述方法(方法2),搜索工作正常,不起作用的是"startLocationItem“(本例中为folderID)。
例如,
如果在我的整个sitecore树中总共有3项包含"my_filed_name=bla_bla“
但是,只有一个项目在文件夹中包含"my_filed_name=bla_bla“({FOLDER_GUID},本例中是”perticular文件夹“)。
那么,,
方法1返回1项(正确),方法2返回3项,尽管"startLocationItem = {FOLDER_GUID} .“(我认为不正确)
问题是:
1.方法1中"startLocationItem“的确切目的是什么?
2.使用"location“过滤器或"startLocationItem for method 2”有什么好处?
发布于 2014-06-16 08:04:58
LinqHelper是一个内部助手类,在正常操作中不应该使用。这是为了帮助Sitecore用户界面与搜索后端对话。它的语法可以在任何时候被更改,因此有可能破坏基于它的东西,而且它也没有被记录下来。
最好将查询转换为普通的Linq查询
using (var context = index.CreateSearchContext)
{
context.GetQueryable<SearchResultItem>().Where(x =>x.Paths.Contains(ID.Parse("your GUID Here")))
}LinqHelper字符串中的“位置”相当于存储在索引中的路径(或_path)字段。
此字段包含作为GUID列表保存的项的所有父项的列表。
通过_path过滤,您可以将查询限制在树的某个节点上,而不影响得分,例如:
/home (id:1234)
/animals (id:5678 = path:1234 / 5678
/cats (id:1111) = path: 1234 / 5678 / 1111
/dogs (id:2222) = path: 1234 / 5678 / 2222
/cars (id:4567) = path: 1234 / 4567
/sports (id:3333) = path: 1234 / 4567 / 3333如果你过滤动物(即5678),你只限制搜索该项目及其子女。
使用筛选器意味着可以限制搜索的上下文,而不影响主查询的评分,因此您将得到以下结果:
using (var context = index.CreateSearchContext)
{
context.GetQueryable<SearchResultItem>().Where(x =>Name.Contains("Exciting"))
.Filter(y => y.Paths.Contains(ID.Parse("your GUID Here")
}这将只在你过滤过的树中搜索名字包含“令人兴奋”的地方。
希望有帮助:)
https://stackoverflow.com/questions/24236918
复制相似问题