Ravendb 如何搜索数字介于2个值之间的文档?

Ravendb 如何搜索数字介于2个值之间的文档?,ravendb,Ravendb,我正在使用Advanced.LuceneQuery RavenQueryStatistics stats = null; vm.Products = DocumentSession.Advanced.LuceneQuery<Product>("Products/Index") .Statistics(out stats) .Where(searchExpression) .OrderBy(columnToSort

我正在使用Advanced.LuceneQuery

RavenQueryStatistics stats = null;
vm.Products = DocumentSession.Advanced.LuceneQuery<Product>("Products/Index")
            .Statistics(out stats)
            .Where(searchExpression)
            .OrderBy(columnToSortBy)
            .Skip((vm.PageIndex - 1) * vm.PageSize)
            .Take(vm.PageSize)
            .ToArray()
            ;
要执行的典型表达式如下所示

"INFO2:(blue*) AND INFO2:(pen*) AND HasPicture:(True) AND IsSpecialOrderItem:(True) AND IsRebateItem:(True) AND IsOfflineSupplierItem:(True) AND CatalogId:(736275001)" 
现在,我需要结合一个基于价格列/索引的范围搜索。构造my where子句的那一部分的语法是什么

要求如下:

价格>=FromNumber 价格(0) { sb.AppendFormat(“CatalogId:({0})和”,vm.Filters.CatalogSelected); } //价格范围 if(vm.Filters.PriceFrom>0&&vm.Filters.PriceTo>0) { sb.AppendFormat(“Price_Range:[{0}到{1}]”,NumberUtil.NumberToString((double)vm.Filters.PriceFrom),NumberUtil.NumberToString((double)vm.Filters.PriceTo)); } } //从字符串中删除最后一个“和” var searchExpression=sb.ToString(); if(searchExpression.EndsWith(“AND”)) { searchExpression=searchExpression.Substring(0,searchExpression.LastIndexOf(“AND”); } //查出来 Logger.WriteMessage(Infrastructure.Logging.LogLevel.Info,“搜索词:“+searchExpression”); 秒表=Stopwatch.StartNew(); string columnToSortBy=string.Empty; if(vm.GridParams!=null) { //特定订购方式 columnToSortBy=vm.GridParams.sidx???“价格”; columnToSortBy=vm.GridParams.sord==“asc”?“+”+columnToSortBy:“-”+columnToSortBy; } //查询的执行 RavenQueryStatistics=null; vm.Products=DocumentSession.Advanced.LuceneQuery(“产品/索引”) .统计数据(统计数据) .Where(搜索表达式) .OrderBy(columnToSortBy) .Skip((vm.PageIndex-1)*vm.PageSize) .Take(vm.PageSize) .ToArray() ; 看,停; vm.TotalResults=stats.TotalResults; Logger.WriteMessage(Infrastructure.Logging.LogLevel.Info,“搜索时间:“+watch.elapsedmillyses”); } 谢谢,,
斯蒂芬

你需要这样的东西(注意“\u范围”):

有关完整信息,请参阅Lucene文档。您还需要将数字设置为正确的十六进制格式。请确保使用Raven.Abstractions命名空间中的内置函数为您执行此操作,而不是自己执行


但是使用低级Lucene API并手动构建查询有什么原因吗?有一个支持LINQ的强类型API将为您做大量工作(
session.Query()
)。

重申Matt的评论。您确实希望避免手工构建查询。 Lucene查询API有一个方法,在这个方法之间可以为您完成所有工作。
请注意,这里有很多神奇之处,比如参数格式化等,这些都是您真正需要考虑的。

Matt,谢谢。我之所以使用string builder版本,是因为直到开发周期的后期,我才发现能够关联查询。谢谢你,奥伦。但这没什么害处,是吗?db返回数据的速度如此之快,令人惊异,而且代码从可读性和维护角度看并没有那么糟糕,所以除非你告诉我必须更改,否则我将保持原样……现在:)
"INFO2:(blue*) AND INFO2:(pen*) AND HasPicture:(True) AND IsSpecialOrderItem:(True) AND IsRebateItem:(True) AND IsOfflineSupplierItem:(True) AND CatalogId:(736275001)" 
private void ProductSearch(ProductSearchViewModel vm)
{

    var terms = vm.SearchTerm
        .ToLower()
        .Split(new char[] { ' ' });

    // Start buildeing up the query
    var sb = new StringBuilder();

    // terms
    foreach (string term in terms)
    {
        sb.AppendFormat("INFO2:({0}*) AND ", term);
    }

    if (vm.Filters != null)
    {

        // picture 
        if (vm.Filters.IsAtrFilterPictureSelected)
        {
            sb.AppendFormat("HasPicture:({0}) AND ", vm.Filters.IsAtrFilterPictureSelected);
        }
        // special order
        if (vm.Filters.IsAtrFilterSpecialOrderSelected)
        {
            sb.AppendFormat("IsSpecialOrderItem:({0}) AND ", vm.Filters.IsAtrFilterSpecialOrderSelected);
        }
        // special price
        if (vm.Filters.IsAtrFilterSpecialPriceSelected)
        {
            sb.AppendFormat("IsSpecialPriceItem:({0}) AND ", vm.Filters.IsAtrFilterSpecialPriceSelected);
        }
        // rebate
        if (vm.Filters.IsAtrFilterRebateSelected)
        {
            sb.AppendFormat("IsRebateItem:({0}) AND ", vm.Filters.IsAtrFilterRebateSelected);
        }
        // offline supplier
        if (vm.Filters.IsAtrFilterOfflineItemSelected)
        {
            sb.AppendFormat("IsOfflineSupplierItem:({0}) AND ", vm.Filters.IsAtrFilterOfflineItemSelected);
        }
        // catalog
        if (vm.Filters.CatalogSelected > 0)
        {
            sb.AppendFormat("CatalogId:({0}) AND ", vm.Filters.CatalogSelected);
        }
        // price range
        if (vm.Filters.PriceFrom > 0 && vm.Filters.PriceTo > 0)
        {
            sb.AppendFormat("Price_Range:[{0} TO {1}]", NumberUtil.NumberToString((double)vm.Filters.PriceFrom), NumberUtil.NumberToString((double)vm.Filters.PriceTo));
        }

    }

    // remove the last 'AND' from the string 
    var searchExpression = sb.ToString();
    if (searchExpression.EndsWith("AND "))
    {
        searchExpression = searchExpression.Substring(0, searchExpression.LastIndexOf("AND "));
    }

    // trace it out
    Logger.WriteMessage(Infrastructure.Logging.LogLevel.Info, "Search Term: " + searchExpression);

    Stopwatch watch = Stopwatch.StartNew();

    string columnToSortBy = string.Empty;
    if (vm.GridParams != null)
    {
        // Luncene specific way of ordering
        columnToSortBy = vm.GridParams.sidx ?? "Price";
        columnToSortBy = vm.GridParams.sord == "asc" ? "+" + columnToSortBy : "-" + columnToSortBy;
    }

    // execution of query
    RavenQueryStatistics stats = null;
    vm.Products = DocumentSession.Advanced.LuceneQuery<Product>("Products/Index")
                .Statistics(out stats)
                .Where(searchExpression)
                .OrderBy(columnToSortBy)
                .Skip((vm.PageIndex - 1) * vm.PageSize)
                .Take(vm.PageSize)
                .ToArray()
                ;

    watch.Stop();
    vm.TotalResults = stats.TotalResults;
    Logger.WriteMessage(Infrastructure.Logging.LogLevel.Info, "Search Time: " + watch.ElapsedMilliseconds);

}
Price_Range:[FromNumber TO ToNumber]