Orchardcms Orchard Lucene自定义搜索服务,具有查询分组和数字范围查询
我正在尝试实现我自己的定制搜索服务。据我所知Orchardcms Orchard Lucene自定义搜索服务,具有查询分组和数字范围查询,orchardcms,lucene.net,orchardcms-1.9,Orchardcms,Lucene.net,Orchardcms 1.9,我正在尝试实现我自己的定制搜索服务。据我所知 // If I wanted to query "+name:camera +price:[100 TO 150] +location:thailand" searchBuilder.WithField("name", "camera").ExactMatch().Mandatory(); searchBuilder.WithinRange("price", 100, 150, true, true).Mandatory(); searchBuild
// If I wanted to query "+name:camera +price:[100 TO 150] +location:thailand"
searchBuilder.WithField("name", "camera").ExactMatch().Mandatory();
searchBuilder.WithinRange("price", 100, 150, true, true).Mandatory();
searchBuilder.WithField("location", "thailand").ExactMatch().Mandatory();
没问题。但是如何使用分组(带括号的子句)处理查询
没有足够的信息供ISearchBuilder.Parse()确定范围的数据类型(是int
、float
还是double
)。看起来Luke也有这个问题,可以使用XML查询解析器来解决,我认为Lucene.Net没有:
我在想如果ISearchBuilder有一个方法允许我们插入自己的查询
// /src/Orchard/Indexing/ISearchBuider.cs
public interface ISearchBuilder {
ISearchBuilder WithQuery(Query query);
}
// /src/Orchard.Web/Modules/Lucene/Services/LuceneSearchBuilder.cs
public class LuceneSearchBuilder : ISearchBuilder {
public ISearchBuilder WithQuery(Query query) {
CreatePendingClause();
_query = query;
return this;
}
}
public class CustomSearchService {
public void Search() {
// construct our own custom queries
var booleanQuery1 = new BooleanQuery();
booleanQuery1.Add(NumericRangeQuery.NewDoubleRange("price", 100, 150, true, true), Occur.SHOULD);
booleanQuery1.Add(NumericRangeQuery.NewDoubleRange("cost", 100, 150, true, true), Occur.SHOULD);
var booleanQuery2 = new BooleanQuery();
booleanQuery2.Add(NumericRangeQuery.NewDoubleRange("bundle-price", 100, 150, true, true), Occur.SHOULD);
booleanQuery2.Add(NumericRangeQuery.NewDoubleRange("total-price", 100, 150, true, true), Occur.SHOULD);
searchBuilder.WithField("name", "camera").ExactMatch().Mandatory();
// insert our custom queries into the SearchBuilder using the newly added interface method (ISearchBuilder.WithQuery()) above
searchBuilder.WithQuery(booleanQuery1).Mandatory();
searchBuilder.WithQuery(booleanQuery2).Mandatory();
}
}
然后我们可以构造更复杂、更灵活的查询
更新
以前有人在上提出过这个问题
您可能应该将搜索API与facet一起使用。这是一个确切的演示:这里有一些注释:我之前已经看到了这一点,但我不知道这与我的问题有什么关系。请你再详细说明一下好吗?从外观上看,facet就像是将一个简单子句作为过滤器应用于现有查询,而不是一组复杂的子句。此外,分面搜索强调对点击次数的汇总。我更感兴趣的是实际命中率(从命中率返回的文档),而不仅仅是命中率。
// /src/Orchard/Indexing/ISearchBuider.cs
public interface ISearchBuilder {
ISearchBuilder WithQuery(Query query);
}
// /src/Orchard.Web/Modules/Lucene/Services/LuceneSearchBuilder.cs
public class LuceneSearchBuilder : ISearchBuilder {
public ISearchBuilder WithQuery(Query query) {
CreatePendingClause();
_query = query;
return this;
}
}
public class CustomSearchService {
public void Search() {
// construct our own custom queries
var booleanQuery1 = new BooleanQuery();
booleanQuery1.Add(NumericRangeQuery.NewDoubleRange("price", 100, 150, true, true), Occur.SHOULD);
booleanQuery1.Add(NumericRangeQuery.NewDoubleRange("cost", 100, 150, true, true), Occur.SHOULD);
var booleanQuery2 = new BooleanQuery();
booleanQuery2.Add(NumericRangeQuery.NewDoubleRange("bundle-price", 100, 150, true, true), Occur.SHOULD);
booleanQuery2.Add(NumericRangeQuery.NewDoubleRange("total-price", 100, 150, true, true), Occur.SHOULD);
searchBuilder.WithField("name", "camera").ExactMatch().Mandatory();
// insert our custom queries into the SearchBuilder using the newly added interface method (ISearchBuilder.WithQuery()) above
searchBuilder.WithQuery(booleanQuery1).Mandatory();
searchBuilder.WithQuery(booleanQuery2).Mandatory();
}
}