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