Solr.NET快速入门(二)【查询】
2017-03-18 21:21
232 查看
简单查询
这是SolrNet中最简单的“查询对象”。 无论你给它什么都直接传递给Solr的q参数ISolrOperations<Product> solr = ... var products1 = solr.Query(new SolrQuery("lucene")); // search for "lucene" in the default field var products2 = solr.Query(new SolrQuery("name:solr")); // search for "solr" in the "name" field
按字段查询
这允许您单独定义字段名称和值:ISolrOperations<Product> solr = ... var products = solr.Query(new SolrQueryByField("name", "solr")); // search for "solr" in the "name" field
它还有一个好处,它为你转义特殊字符。
(SolrNet 0.4.0)您可以通过设置Quoted = false禁用字符转义:
var q = new SolrQueryByField("name", "John*") { Quoted = false };
按范围查询
创建范围查询:
ISolrOperations<Product> solr = ... var products = solr.Query(new SolrQueryByRange<decimal>("price", 100m, 250.50m)); // search for price between 100 and 250.50
按值列表查询
var q = new SolrQueryInList("name", "solr", "samsung", "maxtor");
“任何值”查询
通常方便地查看哪些文档具有定义的字段:
var q = new SolrHasValueQuery("name");
等价于Solr查询名称:[* TO *]
按距离查询
(SolrNet 0.4.0)在LatLonType字段上创建geofilt或bbox过滤器。
例子:
//默认精度为CalculationAccuracy.Radius(精度更高) var q = new SolrQueryByDistance("store", pointLatitude = 45.15, pointLongitude = -93.85, distance = 5);
var q = new SolrQueryByDistance("store", pointLatitude = 45.15, pointLongitude = -93.85, distance = 5, accuracy = CalculationAccuracy.BoundingBox);
查询运算符
您可以使用&&和|| 运算符连接查询,与预期结果:var q = new SolrQuery("solr") && new SolrQuery("name:desc");
生成查询solr AND name:desc
加号(+)运算符也被重载。 它连接查询并将实际运算符保留为Solr配置中指定的默认值。
var q = new SolrQuery("solr") + new SolrQuery("name:desc");
创建查询solr name:desc
要否定查询,可以调用Not()或只使用! 操作符:
var q = !new SolrQuery("solr");
创建查询-solr
最后,减( - )运算符:
var q = new SolrQuery("solr") - new SolrQuery("name:desc"); // solr - name:desc
这相当于(而且更直观):
var q = new SolrQuery("solr") + !new SolrQuery("name:desc"); // solr - name:desc
或者,如果您有一个要聚合的查询列表,可以使用SolrMultipleCriteriaQuery。 例如:
new SolrMultipleCriteriaQuery(new[] {new SolrQuery("1"), new SolrQuery("2")})
相同的:
new SolrQuery("1") + new SolrQuery("2")
您还可以定义用于连接这些查询的运算符,例如:
new SolrMultipleCriteriaQuery(new[] {new SolrQuery("1"), new SolrQuery("2")}, "AND")
提升
您可以通过调用Boost()来提升特定查询,例如:var q = new SolrQuery("name:desc").Boost(2); // (name:desc)^2
DSL
有关表达查询的另一种方法,请参阅fluent API文档。
过滤查询
过滤器查询可用于指定可用于限制可返回的文档的超级集合的查询,而不影响得分。ISolrOperations<Product> solr = ... var products = solr.Query(SolrQuery.All, new QueryOptions { FilterQueries = new ISolrQuery[] { new SolrQueryByField("manu", "apache"), new SolrQueryByRange<decimal>("price", 100m, 200m), } });
字段
默认情况下,Solr返回所有存储的字段。 您能只检索所选字段:ISolrOperations<Product> solr = ... var products = solr.Query(SolrQuery.All, new QueryOptions { Fields = new[] {"id", "manu"} });
排序
默认情况下,Solr返回按“score desc”排序的搜索结果。 您可以通过任何字段对结果进行排序:ISolrOperations<Product> solr = ... var products = solr.Query(SolrQuery.All, new QueryOptions { OrderBy = new[] {new SortOrder("manu", Order.DESC), SortOrder.Parse("id asc")} });
你可以使用RandomSortOrder进行随机排序:
solr.Query(SolrQuery.All, new QueryOptions { OrderBy = new[] {new RandomSortOrder("randomF")}, });
其中randomF是随机排序字段。 RandomSortOrder有各种构造函数来生成随机种子(如上例所示)或使用预定义的种子。
分页
在Solr中,您无法在单个查询中检索所有文档。 但是,默认情况下,SolrNet将尝试检索大量的文档,试图模仿没有TOP子句的RDBMS的行为。 不建议依赖这种行为。 而应始终定义分页参数,例如:ISolrOperations<Product> solr = ... solr.Query("somequery", new QueryOptions{ StartOrCursor = new StartOrCursor.Start(10), Rows = 25 });
其他参数
Solr有很多不直接映射到SolrNet的功能,但你可以启用和使用ExtraParams字典中的大多数。 ExtraParams中定义的参数直接传递给Solr查询字符串。 例如,您可以限制查询允许的最长时间:ISolrOperations<Product> solr = ... var products = solr.Query(SolrQuery.All, new QueryOptions { ExtraParams = new Dictionary<string, string> { {"timeAllowed", "100"} } });
或者启用DisMax而不是标准请求处理程序:
ISolrOperations<Product> solr = ... var products = solr.Query(SolrQuery.All, new QueryOptions { ExtraParams = new Dictionary<string, string> { {"qt", "dismax"} } });
LocalParams
LocalParams提供了一种向某条查询添加某些元数据的方法。 它用于其他事情,为特定查询即时更改默认操作符类型。在SolrNet中,LocalParams由LocalParams类表示,它基本上是一个
Dictionary <string,string>。 LocalParams使用“+”运算符附加到查询。 这里有一个例子:
solr.Query(new LocalParams {{"type", "dismax"},{"qf", "myfield"}} + new SolrQuery("solr rocks"));
这将产生:
q={!type=dismax qf=myfield}solr rocks
有关LocalParams的更多信息在Solr wiki。
ExtraParams
ExtraParams提供了一种在请求查询字符串中添加额外的任意参数的方法。与LocalParams不同,LocalParams是一个IDictionary,ExtraParams是一个IEnumerable>因此它没有重复键的问题。 示例场景可能是您要应用多个提升查询(bq)。
请看下面的例子:
var extraParams = new List<KeyValuePair<string, string>>(); extraParams.Add(new KeyValuePair<string, string>("bq", "SomeQuery^10")); extraParams.Add(new KeyValuePair<string, string>("bq", "SomeOtherQuery^10")); var options new new QueryOptions(); options.ExtraParams = extraParams; //Since my List implements the right interface solr.Query(myQuery, options)
相关文章推荐
- Solr.NET快速入门(五)【相似查询,拼写检查】
- Solr.NET快速入门(六)【聚合统计,分组查询】
- Solr.NET快速入门(四)【相似查询,拼写检查】
- Solr.NET快速入门(五)【聚合统计,分组查询】
- Solr.NET快速入门(四)【高亮显示】
- Solr.NET快速入门(九)【多核多实例,映射验证】
- Solr.NET快速入门(七)【核心管理,Fluent API】
- Solr.NET快速入门(八)【多核多实例,映射验证】
- Solr.NET快速入门(三)【高亮显示】
- ADO.NET Entity Framework查询实体和关联(实体框架快速入门)
- Solr.NET快速入门(八)【覆盖默认映射器,NHibernate集成】
- Solr.NET快速入门(七)【覆盖默认映射器,NHibernate集成】
- Solr.NET快速入门(二)
- Solr.NET快速入门(一)【基本使用,映射字段】
- [新手入门]快速学习 ADO.NET Entity Framework系列文章 #3 -- LINQ-to-SQL、EntitySQL、查询产生器方法(Query builder)三种语法
- Solr.NET快速入门(九)【二进制文档上传】【完】
- *Ajax.Net快速入门*
- iBATIS for .Net 快速入门
- Ajax.Net快速入门
- Ajax.Net快速入门