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