简单查询
这是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)