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

简单查询

这是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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值