隐藏

Solr.NET快速入门(二)【查询】

发布:2022/10/21 11:37:28作者:管理员 来源:本站 浏览次数:958

简单查询


这是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)