您的位置:首页 > 其它

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: