solr.net使用实例教程

简介SOLR

Solr是一个高性能,采用Java5开发,Solr基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎,他是基于Lucene的封装比较成熟的全文搜索服务器。solr怎样部署在windows服务器上的,推荐一枚信峰的博客http://www.cnblogs.com/wenxinghaha/tag/.net%20%20solr/,他这里写的比较详细。solr的5.0目前不支持IK分词,所以只好使用4.10版本,solr 的部署也比较方便,再部署的时间可以通过配置文件将数据库的数据索引到solr服务器内,并且能根据索引时间定时的同步数据到solr服务器。

solr在.NET中的驱动

我们在做查询的时间是使用过的C#语言,所以要用到solr在.NET中的驱动,目前比较流行的有solr.NET和easynet.solr,solr.NET是一个比较稳定的开源的solr驱动,easynet.solr是国内一同行在solr.NET上面做了封装,我采用的是最原生的solr.net,驱动下载地址https://github.com/mausch/SolrNet。由于solr服务器是提供restful接口的操作的,所以solrnet对于solr服务的请求其实还是基于http请求的

solrnet的应用

solrnet的应用我就做过多的说明了,在这里我主要是想说一下solrnet的分组查询

附代码

public  class SolrNetOperate
{
    static SolrNetOperate()
    {
        Startup.Init<LogItems>("http://000.000.000.000:8080/solr/logs");
    }
    /// <summary>
    /// </summary>
    /// <param name="dictPars">查询参数字典</param>
    /// <param name="start">分页开始标识</param>
    /// <param name="rows">每页数量</param>
    /// <param name="startTime">开始时间</param>
    /// <param name="endTime">结束时间</param>
    /// <param name="count">输出参数 总个数</param>
    /// <returns></returns>
    /// <remarks>oldman 2015年7月23日14:11:43</remarks>
    public static List<int> GroupingSerach(Dictionary<string, string> dictPars, int start, int rows,
        DateTime startTime, DateTime endTime, out int count)
    {
        //定义solr
        var solr = ServiceLocator.Current.GetInstance<ISolrOperations<LogItems>>();
        var queryOptions = new QueryOptions();
        //定义分组
        var groupingParameters = new GroupingParameters();
        groupingParameters.Fields = new Collection<string> { "logs_id" };
        groupingParameters.Ngroups = true; //设置查询分组的总个数为true
        //定义过滤条件
        var timeRange = new SolrQueryByRange<DateTime>("logs_time", startTime, endTime);
        queryOptions.AddFilterQueries(timeRange);
        foreach (string key in dictPars.Keys)
        {
            queryOptions.AddFilterQueries(new SolrQueryByField(key, dictPars[key]));
        }
        //定义排序
        queryOptions.OrderBy = new Collection<SortOrder> { new SortOrder("logs_id", Order.DESC) };
        queryOptions.Grouping = groupingParameters;
        queryOptions.Start = start;
        queryOptions.Rows = rows;
        SolrQueryResults<LogItems> res = solr.Query(SolrQuery.All, queryOptions);
        GroupedResults<LogItems> items = res.Grouping["logs_id"];
        count = items.Ngroups ?? 0;
        return items.Groups.Select(item => Convert.ToInt32(item.GroupValue)).ToList();
    }
}

这里是分组后做查询,排序和分页,代码很清晰。

Solrnet教程 

Solrnet基本用法

http://code.google.com/p/solrnet/

 一、开始我们必须生成一个类来映射Solr的Field,下面是Solr默认schema的映射:

public class Product {
    [SolrUniqueKey("id")]
    public string Id { get; set; }
 
    [SolrField("manu_exact")]
    public string Manufacturer { get; set; }
 
    [SolrField("cat")]
    public ICollection<string> Categories { get; set; }
 
    [SolrField("price")]
    public decimal Price { get; set; }
 
    [SolrField("inStock")]
    public bool InStock { get; set; }
}

 

二、初始化:

[TestFixtureSetUp]

public void FixtureSetup() {
    Startup.Init<Product>("http://localhost:8983/solr");
}

三、加入document (确保Solr instance正在运行):

[Test]

public void Add() {
    var p = new Product {
        Id = "SP2514N",
        Manufacturer = "Samsung Electronics Co. Ltd.",
        Categories = new[] {
            "electronics",
            "hard drive",
        },
        Price = 92,
        InStock = true,
    };
var solr = ServiceLocator.Current.GetInstance<ISolrOperations<Product>>();
    solr.Add(p).Commit();
}

四、查询document的位置:

[Test]

public void Query() {
    var solr = ServiceLocator.Current.GetInstance<ISolrOperations<Product>>();
    var results = solr.Query(new SolrQueryByField("id", "SP2514N"));
    Assert.AreEqual(1, results.Count);
    Console.WriteLine(results[0].Manufacturer);
}

 

详细教程

一、映射

有三种映射方式:

1.     Attributes (default)

With this method you decorate the properties you want to map with the SolrField and SolrUniqueKey attributes. The attribute parameter indicates the corresponding Solr field name.

Example:

public class Product {
    [SolrUniqueKey("id")]
    public string Id { get; set; }
 
    [SolrField("manu_exact")]
    public string Manufacturer { get; set; }
 
    [SolrField("cat")]
    public ICollection<string> Categories { get; set; }
 
    [SolrField("price")]
    public decimal Price { get; set; }
 
    [SolrField("inStock")]
    public bool InStock { get; set; }
 
    [SolrField("timestamp")]
    public DateTime Timestamp { get; set; }
 
    [SolrField("weight")]
    public double? Weight { get; set;}
}

This way of mapping is implemented by the AttributesMappingManager class.

2.     All-properties

This maps each property of the class to a field of the exact same name as the property (note that Solr field names are case-sensitive). It's implemented by the AllPropertiesMappingManager class. Note that unique keys cannot be inferred, and therefore have to be explicitly mapped. The same mapping as above could be accomplished like this:

public class Product {
    public string id { get; set; }
    public string manu_exact { get; set; }
    public ICollection<string> cat { get; set; }
    public decimal price { get; set; }
    public bool inStock { get; set; }
    public DateTime timestamp { get; set; }
    public double? weight { get; set; }
}
Then to add the unique key:
var mapper = new AllPropertiesMappingManager();
mapper.SetUniqueKey(typeof(Product).GetProperty("id"));

3.     Manual mapping

This allows you to programmatically define the field for each property:

public class Product {
    public string Id { get; set; }
    public string Manufacturer { get; set; }
    public ICollection<string> Categories { get; set; }
    public decimal Price { get; set; }
    public bool InStock { get; set; }
    public DateTime Timestamp { get; set; }
    public double? Weight { get; set; }
}
var mgr = new MappingManager();
var property = typeof (Product).GetProperty("Id");
mgr.Add(property, "id");
mgr.SetUniqueKey(property);
mgr.Add(typeof(Product).GetProperty("Manufacturer"), "manu_exact");
mgr.Add(typeof(Product).GetProperty("Categories"), "cat_exact");
mgr.Add(typeof(Product).GetProperty("Price"), "price");
mgr.Add(typeof(Product).GetProperty("InStock"), "inStock");
mgr.Add(typeof(Product).GetProperty("Timestamp"), "timestamp");
mgr.Add(typeof(Product).GetProperty("Weight"), "weight");

二、建立 library

映射类以后, 必须初始化library来操作Solr instance. 通常在程序启动的时候运行一次:

Startup.Init<Product>("http://localhost:8983/solr");

然后需要 service locator for the SolrNet service instance 来进行操作:

var solr = ServiceLocator.Current.GetInstance<ISolrOperations<Product>>();
solr.Delete(SolrQuery.All)
    .Add(p)
    .Commit();
var products = solr.Query(new SolrQueryByRange<decimal>("price", 10m, 100m));

 

三、查询

支持不同的查询方式:

1.     Simple query

Whatever you give it is passed straight to Solr's q parameter

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

2.     Query by field

This allows you to define field name and value separately:

ISolrOperations<Product> solr = ...

var products = solr.Query(new SolrQueryByField("name", "solr")); // search for "solr" in the "name" field

It also has the benefit that it handles special character escaping for you.

3.     Query by range

Creates a range query:

ISolrOperations<Product> solr = ...

var products = solr.Query(new SolrQueryByRange<decimal>("price", 100m, 250.50m)); // search for price between 100 and 250.50

4.     Query by list of values

var q = new SolrQueryInList("name", "solr", "samsung", "maxtor");

is the same as "name:solr OR name:samsung OR name:maxtor"

5.     "Any value" query

It's often convenient to see what documents have a field defined or not:

var q = new SolrHasValueQuery("name");

is equivalent to the Solr query "name:[* TO *]"

6.     Query operators

You can use the && and || operators to concatenate operators with the expected results:

var q = new SolrQuery("solr") && new SolrQuery("name:desc");

generates the query "solr AND name:desc"

The plus (+) operator is also overloaded.

var q = new SolrQuery("solr") + new SolrQuery("name:desc");

creates the query "solr name:desc"

To negate a query, you can call Not() on it or just use the '!' operator:

var q = !new SolrQuery("solr");

creates the query "-solr"

 

四、Facets 查询

SolrNet supports faceted searching.

There are basically three kinds of facet queries:

1. querying by field

2. date facets

3. arbitrary facet queries

Facet queries are issued through the FacetQueries property of QueryOptions. Then the QueryOptions instance is passed to the server instance.

1.     Querying by field

Querying by field is handled by the SolrFacetFieldQuery class. Results are available through the FacetFields property.

Example: print all categories sorted by popularity.

ISolrOperations<Document> solr = ...
var r = solr.Query(SolrQuery.All, new QueryOptions {
    Rows = 0,
    Facet = new FacetParameters {
        Queries = new[] {new SolrFacetFieldQuery("category")}
    }
});
foreach (var facet in r.FacetFields["category"]) {
  Console.WriteLine("{0}: {1}", facet.Key, facet.Value);
}

2.     Date facets

Date facet queries create facets from date ranges. Sample code:

ISolrOperations<Product> solr = ...
ISolrQueryResults<Product> results = solr.Query(SolrQuery.All, new QueryOptions {
    Facet = new FacetParameters {
        Queries = new[] {
            new SolrFacetDateQuery("timestamp", new DateTime(2001, 1, 1).AddDays(-1) /* range start */, new DateTime(2001, 1, 1).AddMonths(1) /* range end */, "+1DAY" /* gap */) {
                HardEnd = true,
                Other = new[] {FacetDateOther.After, FacetDateOther.Before}
            },
        }
    }
});
DateFacetingResult dateFacetResult = results.FacetDates["timestamp"];
foreach (KeyValuePair<DateTime, int> dr in dateFacetResult.DateResults) {
    Console.WriteLine(dr.Key);
    Console.WriteLine(dr.Value);
}

3.     Arbitrary facet queries

Arbitrary facet queries are handled by the SolrFacetQuery class. Results are available through the FacetQueries property.

Example: segregate items by price (less than $500 - more than $500)

ISolrOperations<Document> solr = ...
var lessThan500 = new SolrQueryByRange<decimal>("price", 0m, 500m);
var moreThan500 = new SolrQueryByRange<string>("price", "500", "*");
var r = solr.Query(SolrQuery.All, new QueryOptions {
    Rows = 0,
    Facet = new FacetParameters {
        Queries = new[] {new SolrFacetQuery(lessThan500), new SolrFacetQuery(moreThan500)}
    }
});
foreach (var facet in r.FacetQueries) {
  Console.WriteLine("{0}: {1}", facet.Key, facet.Value);
}

For an overview of faceted search with Solr, see SolrFacetingOverview.

五、高亮

Sample code:

var results = solr.Query(new SolrQueryByField("features", "noise"), new QueryOptions {
    Highlight = new HighlightingParameters {
        Fields = new[] {"features"},
    }
});
foreach (var h in results.Highlights[results[0]]) {
    Console.WriteLine("{0}: {1}", h.Key, h.Value);
}

 
would print for example:

features: <em>Noise</em>Guard, SilentSeek technology, Fluid Dynamic Bearing (FDB) motor

Solr reference documentation: http://wiki.apache.org/solr/HighlightingParameters

六、More Like This

This option returns a list of similar documents for each document returned in the results of the original query.

Parameters are defined through the MoreLikeThis property of the QueryOptions

Example: searching for "apache", for each document in the result search for similar documents in the "cat" (category) and "manu" (manufacturer) fields:

ISolrBasicOperations<Product> solr = ...
var results = solr.Query(new SolrQuery("apache"), new QueryOptions {
    MoreLikeThis = new MoreLikeThisParameters(new[] {"cat", "manu"}) {
        MinDocFreq = 1, // minimum document frequency
        MinTermFreq = 1, // minimum term frequency
    },
});
foreach (var r in results.SimilarResults) {
    Console.WriteLine("Similar documents to {0}", r.Key.Id);
    foreach (var similar in r.Value)
        Console.WriteLine(similar.Id);
    Console.WriteLine();
}

All parameters defined in the Solr docs are supported.
 

七、拼写检查

You'll need to install the SpellCheckComponent in the standard request handler in order to use this.

Next, a spellcheck dictionary must be provided. Normally a default dictionary is created by invoking BuildSpellCheckDictionary() once per index:

ISolrOperations<Product> solr = ...

solr.BuildSpellCheckDictionary();

Now you can start issuing spellchecking queries by defining the SpellCheck parameter in the QueryOptions:

ISolrOperations<Product> solr = ...
var results = solr.Query("ipo appl", new QueryOptions {
  SpellCheck = new SpellCheckingParameters {Collate = true}
});

 

Then you get the suggestions from results.SpellChecking, i.e.:

foreach (var sc in results.SpellChecking) {
    Console.WriteLine("Query: {0}", sc.Query);
    foreach (var s in sc.Suggestions) {
        Console.WriteLine("Suggestion: {0}", s);                    
    }
}

which would print something like:

Query: ipo

Suggestion: ipod

Query: appl

Suggestion: apple

All of the SpellCheckComponent parameters are supported, except for the extendedResults option.

八、Stats

This feature provides you with simple statistics for numeric fields within the query results:

Sample usage:

ISolrOperations<Product> solr = ...
var results = solr.Query(SolrQuery.All, new QueryOptions {
    Rows = 0,
    Stats = new StatsParameters {
        Facets = new[] { "inStock" },
        FieldsWithFacets = new Dictionary<string, ICollection<string>> {
            {"popularity", new List<string> {"price"}}
        }
    }
});
 
foreach (var kv in results.Stats) {
    Console.WriteLine("Field {0}: ", kv.Key);
    Console.WriteLine("Min: {0}", s.Min);
    Console.WriteLine("Max: {0}", s.Max);
    Console.WriteLine("Sum of squares: {0}", s.SumOfSquares);
    foreach (var f in s.FacetResults) {
        Console.WriteLine("Facet: {0}", f.Key);
        foreach (var fv in f.Value) {
            Console.WriteLine("Facet value: {0}", fv.Key);
            Console.WriteLine("Min: {0}", fv.Value.Min);
            Console.WriteLine("Max: {0}", fv.Value.Max);
            Console.WriteLine("Sum of squares: {0}", fv.Value.SumOfSquares);
        }
    }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索服务器
, string
, class
new
,以便于您获取更多的相关知识。

时间: 2024-10-29 14:14:43

solr.net使用实例教程的相关文章

PHP单例模式实现商城购物车功能-PHP实例教程

  PHP单例模式实现商城购物车功能-PHP实例教程完成这个小功能必须会写需求 养成好的习惯 Php购物车的开发需求功能如下 1: 购物车放在session里 2: 单例模式来开发 功能: 增删改查 增一个商品 减少 PHP单例模式实现商城购物车功能-PHP实例教程完成这个小功能必须会写需求 养成好的习惯 Php购物车的开发需求功能如下:php100.com 1: 购物车放在session里 2: 单例模式来开发 功能: 增删改查 增一个商品 减少一个商品(改,数量) 删 去掉一个商品 清空购物

web标准布局实例教程

web|web标准|教程 我相信来经典论坛学习标准的朋友,99%都不是为了进W3C,不是为了成为专业的研究人员,那么大家来的目的是什么呢?很简单,其实都是想通过标准的学习让自己多增加一项技能而已,让自己在找工作的时候不会在被"需要熟练掌握web标准"而难倒,在下面的实例中xhtml并没有什么语意,文章的目的只是让然大家能更好的掌握CSS中相对.绝对定位的用法(新手问此问题的确实很多),及如何有效的结合背景,实现比较复杂的布局.不足之处还望前辈们能指点一二,感谢! 第一步: 先来随便设计

CSS实例教程:简单的button风格的UI按钮

文章简介:CSS实例教程:简单的button风格的UI按钮. button应该是UI库中最常用到的一种.我个人对google+的那种简单的button风格比较喜欢,因为那样在不同的浏览器下视觉差异不是很大.不过现在自己确实已经没有心思去琢磨怎么去弥补ie的不足,所以下面的东西就不要拿ie打开了.还是贴出代码吧 <!DOCTYPE html> <html> <head>                        <title></title> 

CSS3实例教程代码:简单制作遨游浏览器LOGO

文章简介:CSS3实例教程代码:简单制作遨游浏览器LOGO. <!DOCTYPE HTML> <html> <head> <title>LOGO</title> <style type="text/css"> * {margin:0; padding:0} .main {width:800px; margin:50px auto 0}  .main_wrapper {width:240px; height:240p

CSS3实例教程:hover、active和:focus伪选择器

文章简介:CSS3实例教程:hover.active和:focus伪选择器. CSS3的伪类选择器就是多,今天我们来学习新的伪类选择器--UL状态伪类选择器.这些选择器都有一个共同的特征名那就是定义的样式只有当元素处于某种状态下时才起作用,在默认状态下无效. 今天我们先来接触:hover.active和:focus这三种状态伪类选择器. :hover选择器.:active选择器和:focus选择器 :hover选择器:当鼠标悬停在所指定的元素上时所使用的样式: :active选择器:当所指定的元

CSS3实例教程:盒模型添加阴影属性box

文章简介:我们要对盒模型添加阴影怎么办呢?其实它的用法与text-shadow用法一样,只不过属性名称是box-shadow. 我们要对盒模型添加阴影怎么办呢?其实它的用法与text-shadow用法一样,只不过属性名称是box-shadow. 相关文章:CSS3教程:网页文字阴影属性text-shadow box-shadow: 此属性与text-shadow一样有4个值,前两个值分别表示水平方向位移距离和垂直方向的位移距离,第三个值表示阴影的模糊半径(包含0及以下的值均表示无模糊),最后一个

Javascript实例教程(1) 目录

javascript|教程 javascript是一种基于对象和事件驱动并具有安全性能的脚本语言.使用它的目的是与HTML超文本标记语言.Java 脚本语言(Java小程序)一起实现在一个Web页面中链接多个对象,与Web客户交互作用,从而可以开发客户端的应用程序等.它是通过嵌入或调入在标准的HTML语言中实现的.它的出现弥补了HTML语言的缺陷,它是Java与HTML折衷的选择.本javascript实例教程旨在通过介绍一些实例来加深对Javascrip的理解.本系列教程包括:1. 利用jav

ASP实例教程:Drive对象

取得指定驱动器的可用空间数:本例演示如何首先创建一个FileSystemObject对象,然后使用AvailableSpace属性来获得指定驱动器的可用空间. 取得指定驱动器的可用空间数:本例演示如何首先创建一个FileSystemObject对象,然后使用AvailableSpace属性来获得指定驱动器的可用空间.取得指定驱动器的剩余空间容量:本例演示如何使用FreeSpace空间属性来取得指定驱动器的剩余空间.取得指定驱动器的总容量:本例演 Drive 对象 注意:本实例教程因为和具体空间的

CSS实例教程:简单的的滑动导航栏效果

文章简介:CSS实例教程:简单的的滑动导航栏效果. 由于网页字体的限制,以及对导航栏美观的需求,使用background-repeat来做一个简单的文字导航栏已经远远不够了.在很多场合,导航栏的背景是一个图案,字体也不再是单调的宋体,这就需要我们把导航栏的整体效果做图在网页中使用. 今天我们就来做一个简单的的滑动导航栏效果(不知道应该叫它什么^_^),效果如下图:   思路:通过改变链接鼠标悬停状态(hover)的背景图片,来达到把鼠标放上去有高亮显示的效果. 方法:在本例中,我们是通过调整各链