Solr学习总结(八)IK 中文分词的配置和使用

  最近,很多朋友问我solr 中文分词配置的问题,都不知道怎么配置,怎么使用,原以为很简单,没想到这么多朋友都有问题,所以今天就总结总结中文分词的配置吧。

 

有的时候,用户搜索的关键字,可能是一句话,不是很规范。所以在 Solr 中查询出的时候,就需要将用户输入的关键字进行分词。

 

目前有很多优秀的中文分词组件。本篇只以  IKAnalyzer 分词为例,讲解如何在 solr  中及集成中文分词,使用 IKAnalyzer的原因 IK 比其他中文分词维护的勤快,和 Solr 集成也相对容易。具体就不多介绍,这里直接solr 集成 IK 的方法。

 

1. 首先,下载IKAnalyzer下载

注意:以前老的IK 不支持Solr 5.3的版本 ,请注意下载最新的。

 

2. 将ik的相关文件 拷贝到 webapps\solr\WEB-INF\lib 目录下

 

3. 在 solr_home\mycore1\conf\schema.xml 增加如下配置

         
         "text_ik" class="solr.TextField">   
                   "index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>   
                   "query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>   

同时,把需要分词的字段,设置为text_ik,

  "id" type="int" indexed="true" stored="true" required="true" multiValued="false" />
   "name" type="text_ik" indexed="true" stored="true" required="true" multiValued="false" />
   "title" type="text_ik" indexed="true" stored="true" required="true" multiValued="false" />
   "category" type="int" indexed="true" stored="true" required="true" multiValued="false" />
   "content" type="text_ik" indexed="true" stored="true" required="true" multiValued="false" />
   "price" type="double" indexed="true" stored="true" required="true" multiValued="false" />
   "color" type="string" indexed="true" stored="true" required="true" multiValued="false" />
   "orderBy" type="int" indexed="true" stored="true" required="true" multiValued="false" />
   "updatetime" type="date" indexed="true" stored="true" required="true" multiValued="false" />

 

4. 重启服务

注意:如果之前已经创建了索引,需要将之前的索引删掉,重新创建分词后的索引。

 

5. 在admin后台, analysis 下查看分词效果

1. 中文分词效果

2. 索引查询效果

 

6. 配置IKAnalyzer分词器的扩展词典,停止词词典

1. 将 文件夹下的IKAnalyzer.cfg.xml , ext.dic和stopword.dic 三个文件 复制到/webapps/solr/WEB-INF/classes 目录下,并修改IKAnalyzer.cfg.xml

    
    "http://java.sun.com/dtd/properties.dtd">  
      
        IK Analyzer 扩展配置
        
        "ext_dict">ext.dic; 

        
        "ext_stopwords">stopword.dic; 

2. 在ext.dic 里增加自己的扩展词典,例如,婴儿奶粉3段

 

注意:  记得将stopword.dic,ext.dic的编码方式为UTF-8 无BOM的编码方式。

 

Solr学习总结(七)Solr搜索引擎的整体架构

  经过前面一段时间的努力,终于把我所知道的关于solr 的内容都总结完了。前面讲到了solr 的安装配置,web管理后台的使用,solr 的查询参数和查询语法,还说到了solr的客户端 solrnet 的基本用法和Query,Facet,高亮等实际开发中的常用方法。可以说solr的相关的基础的内容,都已经讲到了。

  但是,总还是觉得,还少点什么,感觉还有很多没有总结到。比如分词,数据导入,索引增量更新,Solr服务器的主从复制等等。确实还有很多内容没有总结到位。

  然而,细想之后,我又发现,对于Solr的实际运用中的各种问题,是总结不完的。每个人碰到的都是不一样。你碰到的问题,有可能大家谁都没有碰到过,你是第一个。所以只有大家相互交流,相互分享,一起探讨解决办法。

  最后讲一讲,实际生产过程中,solr 是如何使用的,Solr整体的架构(但是这也只是个基础的架构,实际情况可能比这个复杂的多)。

  

  说明:

  1. Window索引服务,负责定时增量更新(有人会问为什么不用solr的自动增量更新,我只能说,这是各个项目的选择)。

  2. Search 是一个wcf 或是web api 接口。负责提供索引查询服务。

3. Solr 服务器集群,按照主从模式。

 

索引更新规则:

1. 这里用的是Windows服务,定时自动执行更新。而不是直接通过数据库更新。(很多人问我,配置Solr 数据库更新,其实不必,实际生产环节,都是通过程序自动更新。很少用solr data import)。

2. 商品和店铺的索引更新,例如商品上下架,价格修改等,10分钟内增量更新到Solr 索引。

3. 每天晚上,执行全量更新。保证数据库中的数据,都全部更新到线上索引。

  最后的最后,本人才疏学浅,了解有限,只是把自己知道的写出来,如有不足或不正确之处,欢迎大家批评指正,相互交流。

 

Solr学习总结(六)SolrNet的高级用法(复杂查询,分页,高亮,Facet查询)

        上一篇,讲到了SolrNet的基本用法及CURD,这个算是SolrNet 的入门知识介绍吧,昨天写完之后,有朋友评论说,这些感觉都被写烂了。没错,这些基本的用法,在网上百度,资料肯定一大堆,有一些写的肯定比我的好,不过,这个是Solr系列文章,会从Solr的基础入门讲到实际开发中的分页,高亮,Facet查询等高级用法。所以,基础的入门也会涉及一些,望大家见谅。我用这么多篇文章,来总结Solr 也是为了将Solr 的 安装,配置,开发等等,整个过程的资料,都能总结汇集到一起,这样不管是懂Solr还是不知道Solr 的人,都能按照我的文章,一步一步的学习入门。

        下面就来讲一讲SolrNet的高级用法(复杂查询,分页,高亮,Facet查询)。其实这些高级查询,说白了,也还是SolrNet 将Solr 的相关查询参数封装起来了,使得我们调用更加方便。但是实际上还是按照Solr 的参数规则,拼接查询参数,并向Solr 服务器发起请求。这就是所谓的万变不离其宗,这也是我前面花两篇文章,来总结Solr 的查询参数的初心。如果有兴趣可以监控SolrNet 发起的Http 请求,看看是不是按照solr 的查询参数规则来的。具体Solr的查询参数相关说明,请看这篇文章《Solr学习总结(四)Solr查询参数》

   示例下载:Demo下载

   1.复杂查询

     public static void Query(string keyword, int category, string color, double price, int start, DateTime? startTime, DateTime? endTime, int pageNum)
        {
            //定义solr
            ISolrOperations solr = ServiceLocator.Current.GetInstance<ISolrOperations>();
            QueryOptions options = new QueryOptions();//创建条件集合
            List query = new List();

            if (!string.IsNullOrEmpty(keyword))
            {
                List ar = new List();
                string[] keywords = keyword.Split(new char[] { ',' });
                foreach (string a in keywords)
                {
                    ar.Add(new SolrQueryByField("id", a));
                }
                //创建ID 条件集合的关系,是OR还是AND
                var kw = new SolrMultipleCriteriaQuery(ar, "OR");
                //添加至条件集合
                query.Add(kw);
            }

            if (category > 0)
            {
                // 创建分类的查询条件
                var qCate = new SolrQueryByField("category", category.ToString());
                //添加条件
                query.Add(qCate);
            }

            //查询颜色,多个颜色,用 ,号隔开 green,grey
            if (color != "")
            {
                //创建颜色条件集合
                List ar = new List();
                string[] colors = color.Split(new char[] { ',' });
                foreach (string a in colors)
                {
                    ar.Add(new SolrQueryByField("color", a));
                }

                //创建颜色查询条件的关系,是OR还是AND
                var qcolor = new SolrMultipleCriteriaQuery(ar, "OR");

                //添加至条件集合
                query.Add(qcolor);
            }

            //创建时间范围条件, 开始时间和结束时间 
            SolrQueryByRange qDateRange = null;
            if (startTime != null && endTime != null)
            {
                var stime = DateTime.Parse(startTime.ToString());
                var etime = DateTime.Parse(endTime.ToString());

                //后两个参数,一个是开始时间,一个是结束时时间
                qDateRange = new SolrQueryByRange("updatetime", stime, etime);
                //时间范围条件加入集合
                query.Add(qDateRange);
            }

            //设定查询结果的排序,按照时间倒排序.
            options.AddOrder(new SolrNet.SortOrder("updatetime", Order.DESC));

            //条件集合之间的关系
            var qTBO = new SolrMultipleCriteriaQuery(query, "AND");

            //执行查询
            SolrQueryResults results = solr.Query(qTBO, options);
        // 显示查询结果
            foreach (Product p in results)
            {
                Console.WriteLine("id:{0}   name:{1}   color:{2}     price:{3}", p.id, p.name, p.color, p.price);
            }
            Console.ReadKey();
        }

   说明:a. QueryOptions 查询的相关设置,分页属性,结果集排序,条件集合之间的关系(AND, OR)等。

                 b. ISolrQuery 查询条件,集合

                 c. SolrMultipleCriteriaQuery条件集合之间的关系,(AND,OR)

   2.分页

分页其实也就是比查询,多设置了Rows和Start 参数。其他的和查询一致。最后返回的时候,除了返回查询结果,还要返回总页数和数据总条数

       QueryOptions options = new QueryOptions();
            //分页参数
            options.Rows = pageNum; //数据条数
            options.Start = start;  //开始项    
       // 拼接相关查询条件
       .
       .
       .
           //执行查询
            SolrQueryResults results = solr.Query(qTBO, options);

            // 得到返回的数据总条数和total和 总页数 用于分页显示,
            var total = results.NumFound;
            var pageCount = total / pageNum + 1;   

3.高亮

            QueryOptions options = new QueryOptions();
       
            var high = new HighlightingParameters();
            high.Fields = new List<string> { "color" };
            high.BeforeTerm = "";
            high.AfterTerm = "";

            options.Highlight = high;
             // 拼接其他查询条件
            .
       .
       .
        //执行查询
            SolrQueryResults results = solr.Query(qTBO, options);
        // 处理需要高亮的字段
            var highlights = results.Highlights;
            foreach (var item in results)
            {
                var t = highlights[item.id.ToString()].Values.ToList()[0].ToList()[0];
                item.color = t;
            }

            // 显示查询结果
            foreach (Product p in results)
            {
                Console.WriteLine("id:{0}   name:{1}   color:{2}     price:{3}", p.id, p.name, p.color, p.price);
            }    

 

4.Facet查询

Facet 本书还有很多参数来限制,选择结果集。这里只介绍了几个基本的Facet用法。其他的就不一一细说。大家自己去研究吧。

1. 普通分组,按照某个字段分组

      var facet = new FacetParameters
                {
                    Queries = new[] { new SolrFacetFieldQuery("category") }
                };

           options.Facet = facet;

           var qTBO = new SolrMultipleCriteriaQuery(query, "AND");

           SolrQueryResults results = solr.Query(qTBO, options);

           foreach (var f in results.FacetFields["category"])
           {
               Console.WriteLine("{0}: {1}", f.Key, f.Value);
           }

2. 时间段分组

SolrFacetDateQuery 类里面的几个参数比较复杂。具体的可以去研究研究Date Facet 相关的参数说明。

        // 时间分组
            var facet = new FacetParameters
            {
                Queries = new[] { 
                    new SolrFacetDateQuery(
                        "updatetime", 
                        new DateTime(2015, 11, 1) /* 开始时间 */, 
                        new DateTime(2015,12, 31) /* 结束时间 */, 
                        "+7DAY" /* 时间间隔 */) 
                    {
                        HardEnd = true,
                        Other = new[] {FacetDateOther.After, FacetDateOther.Before}
                    },
                }
            };

            options.Facet = facet;

            //条件集合之间的关系
            var qTBO = new SolrMultipleCriteriaQuery(query, "AND");

            SolrQueryResults results = solr.Query(qTBO, options);

            DateFacetingResult dateFacetResult = results.FacetDates["updatetime"];

            foreach (KeyValuePair<DateTime, int> dr in dateFacetResult.DateResults)
            {
                Console.WriteLine(dr.Key);
                Console.WriteLine(dr.Value);
            }

 

3. 任意分组

       // 按照价格段分组
            var lessThan30 = new SolrQueryByRange<decimal>("price", 0m, 30m);
            var lessThan70 = new SolrQueryByRange<decimal>("price", 30m, 70m);
            var moreThan70 = new SolrQueryByRange<decimal>("price", 70m, 100m);

            var facet = new FacetParameters
             {
                 Queries = new[] { new SolrFacetQuery(lessThan30), new SolrFacetQuery(lessThan70), new SolrFacetQuery(moreThan70) }
             };

            options.Facet = facet;

            var qTBO = new SolrMultipleCriteriaQuery(query, "AND");

            SolrQueryResults results = solr.Query(qTBO, options);
            foreach (var f in results.FacetQueries)
            {
                Console.WriteLine("{0}: {1}", f.Key, f.Value);
            }

4. Pivot faceting, Pivot 这个概念还是蛮难解释的,有点类似于BI 报表中的数据钻取,即 一层一层的进行分组 统计,例如 先按颜色,分组统计,然后在统计的结果集某个子分组里面,再按照 分类 进行分组统计。

        /// 

        /// Facet 查询
        ///

 

        /// 
        public static void Query_FactPivot()
        {
            ISolrOperations solr = ServiceLocator.Current.GetInstance<ISolrOperations>();
            //Create a facet Pivot Query
            var facetPivotQuery = new SolrFacetPivotQuery()
            {
                //默认是 1 pivot, 先 category 再按 color 分组
                //如果是多个,则在后面继续追加 ,new PivotFields("color", "category")
                Fields = new[] { new PivotFields("color", "category")},

                //最小记录数
                MinCount = 1
            };

            //创建一个查询参数
            //同时 pivotQueries 可以和其他查询条件一起混用
            var facetParams = new FacetParameters()
            {
                Queries = new[] { facetPivotQuery },

                Limit = 15
            };

            var queryOptions = new QueryOptions();
            queryOptions.Facet = facetParams;
            queryOptions.Rows = 0;

            var results = solr.Query("*:*", queryOptions);
            if (results.FacetPivots.Count > 0)
            {
                foreach (var pivotTable in results.FacetPivots)
                {
                    Console. WriteLine("Pivot table for " + pivotTable.Key);
                    foreach (var pivot in pivotTable.Value)
                    {
                        Console.WriteLine("  Pivot: " + pivot.Field + " with value " + pivot.Value + ". Child Pivots:");
                        foreach (var pivotChild in pivot.ChildPivots)
                        {
                            Console.WriteLine("    - " + pivotChild.Value + " (" + pivotChild.Count + ")");
                        }
                    }
                }
            }

            Console.ReadKey();
        }      

这个是比较精细化,也更加复杂的Facet查询。这个由于本人实际中没有用到过。所以就不在这里多讲了。感兴趣的朋友,可以去研究研究,

 

solr学习总结(五)solrnet的增删改查等基本用法

  上一篇已经讲到了Solr 查询的相关的参数。这里在讲讲C#是如何通过客户端请求和接受solr服务器的数据, 这里推荐使用SolrNet,主要是:SolrNet使用非常方便,而且用户众多,一直都在更新,感兴趣的可以加入他们的邮件群组,方便迅速了解SolrNet的最新动态。

  SorlNet源码地址:https://github.com/mausch/SolrNet

  SolrNet使用说明文档:https://github.com/mausch/SolrNet/tree/master/Documentation

  一、创建一个项目控制台程序,并引用SolrNet.dll。Demo下载

    

  注意:SolrNet 依赖HttpWebAdapters.dll和Microsoft.Practices.ServiceLocation.dll 这两个dll 文件,所以,如果编译或者测试有问题,引用这两个dll 文件应该就ok了。

  二、在solr 的schema.xml 增加相关的Filed 字段,同时创建一个实体类,与schema.xml中的Filed 字段映射。

   public class Product
    {
        [SolrUniqueKey("id")]
        public int id { get; set; }

        [SolrField("name")]
        public string name { get; set; }

        [SolrField("title")]
        public string title { get; set; }

        [SolrField("category")]
        public string category { get; set; }

        [SolrField("content")]
        public string content { get; set; }

        [SolrField("price")]
        public double price { get; set; }

        [SolrField("color")]
        public string color { get; set; }

        [SolrField("updatetime")]
        public DateTime updatetime { get; set; }

        [SolrField("orderBy")]
        public int orderBy { get; set; }
    }

同时,schema.xml中也要加上相应的Filed 字段,打开solr_home\mycore1\conf 下的schema.xml文件,增加如下Field 配置,如果不知道如何操作,请参考前一篇文章,《Solr学习总结(二)Solr的安装与配置》

   "id" type="int" indexed="true" stored="true" required="true" multiValued="false" /> 
   "name" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
   "title" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
   "category" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
   "content" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
   "price" type="double" indexed="true" stored="true" required="true" multiValued="false" />
   "color" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
   "orderBy" type="int" indexed="true" stored="true" required="true" multiValued="false" /> 
   "updatetime" type="date" indexed="true" stored="true" required="true" multiValued="false" />

  三、开始调用solrnet:

      1.初始化

   Startup.Init("http://localhost:8080/solr/mycore1");

    2.增加和修改索引(document)

      Solr 索引的增加和修改,都是Add() 方法,solr 会自动判断是否存在此所以,有就修改,没有就新增。

     ISolrOperations solr = ServiceLocator.Current.GetInstance<ISolrOperations>();

         var p = new Product()
             {
                 id = 201,
                 name = "product 201",
                 title = "title 201",
                 category = "201",
                 content = "title 201 green",
                 color = "green",
                 price = 67.92,
                 updatetime = DateTime.Now.AddDays(-101),
                 orderBy = 101
             };
        solr.Add(p);
        solr.Commit();

    3. 删除索引

      solrnet 重写了多个 delete()方法。这里只介绍一个,其他的自己研究吧。

     ISolrOperations solr = ServiceLocator.Current.GetInstance<ISolrOperations>();

        var p = new Product()
        {
             id = 201,
        };

        solr.Delete(p);
        solr.Commit();

    注意:调用 Add() 或是 Delete()方法,必须在他们之后加上  Commit(),否是请求是不会被处理的。

    4.查询

            ISolrOperations solr = ServiceLocator.Current.GetInstance<ISolrOperations>();

            SolrQueryResults phoneTaggedArticles = solr.Query(new SolrQuery("id:1"));

            foreach (Product p in phoneTaggedArticles)
            {
                Console.WriteLine(string.Format("{0}: {1}", p.id, p.title));
            }
            Console.WriteLine();

 

     到这里,Solrnet的基本用法已经说完了,下一篇,将聊聊Solr的一些高级用法,solr 的复杂查询,高亮,Facet分组查询等。

Solr学习总结(四)Solr查询参数

今天还是不会涉及到.Net和数据库操作,主要还是总结Solr 的查询参数,还是那句话,只有先明白了solr的基础内容和查询语法,后续学习solr 的C#和数据库操作,都是水到渠成的事。这里先列出solr查询所需要的参数

wiki 地址:http://wiki.apache.org/solr/FrontPage, 里面有各个参数详细的介绍。

  一.基本查询

q  查询的关键字,此参数最为重要,例如,q=id:1,默认为q=*:*,

fl  指定返回哪些字段,用逗号或空格分隔,注意:字段区分大小写,例如,fl= id,title,sort

start  返回结果的第几条记录开始,一般分页用,默认0开始

rows  指定返回结果最多有多少条记录,默认值为 10,配合start实现分页

sort  排序方式,例如id  desc 表示按照 “id” 降序

wt  (writer type)指定输出格式,有 xml, json, php等

fq  (filter query)过虑查询,提供一个可选的筛选器查询。返回在q查询符合结果中同时符合的fq条件的查询结果,例如:q=id:1&fq=sort:[1 TO 5],找关键字id为1 的,并且sort是1到5之间的。

df   默认的查询字段,一般默认指定。

qt  (query type)指定那个类型来处理查询请求,一般不用指定,默认是standard。

indent   返回的结果是否缩进,默认关闭,用 indent=true|on 开启,一般调试json,php,phps,ruby输出才有必要用这个参数。

version   查询语法的版本,建议不使用它,由服务器指定默认值。

 

  二. Solr的检索运算符

“:”  指定字段查指定值,如返回所有值*:*

“?”  表示单个任意字符的通配

“*”  表示多个任意字符的通配(不能在检索的项开始使用*或者?符号)

“~”  表示模糊检索,如检索拼写类似于”roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回相似度在0.8以上的记录。

AND、||  布尔操作符

OR、&&  布尔操作符

NOT、!、-(排除操作符不能单独与项使用构成查询)

“+”  存在操作符,要求符号”+”后的项必须在文档相应的域中存在²

( )  用于构成子查询

[]  包含范围检索,如检索某时间段记录,包含头尾,date:[201507 TO 201510]

{}  不包含范围检索,如检索某时间段记录,不包含头尾date:{201507 TO 201510}

 

  三. 高亮

h1  是否高亮,hl=true,表示采用高亮

hl.fl  设定高亮显示的字段,用空格或逗号隔开的字段列表。要启用某个字段的highlight功能,就得保证该字段在schema中是stored。如果该参数未被给出,那么就会高亮默认字段 standard handler会用df参数,dismax字段用qf参数。你可以使用星号去方便的高亮所有字段。如果你使用了通配符,那么要考虑启用hl.requiredFieldMatch选项。

hl.requireFieldMatch   如果置为true,除非用hl.fl指定了该字段,查询结果才会被高亮。它的默认值是false。

hl.usePhraseHighlighter   如果一个查询中含有短语(引号框起来的)那么会保证一定要完全匹配短语的才会被高亮。

hl.highlightMultiTerm   如果使用通配符和模糊搜索,那么会确保与通配符匹配的term会高亮。默认为false,同时hl.usePhraseHighlighter要为true。

hl.fragsize   返回的最大字符数。默认是100.如果为0,那么该字段不会被fragmented且整个字段的值会被返回。

 

  四. 分组

官方wiki:http://wiki.apache.org/solr/SimpleFacetParameters#Facet_Fields_and_Facet_Queries

这是facet的官方wiki,里面有facet各个参数的详细说明。所以这里只说一些常用的。

Facet是Solr的核心搜索功能,主要是导航(Guided Navigation)、参数化查询(Paramatic Search)。Facet的主要好处是在搜索的同时,可以按照Facet条件进行分组统计,给出导航信息,改善搜索体验。

Facet主要分为:Field Facet 和  Date Facet 两大类

1. Field Facet

facet 参数字段必须被索引

facet=on 或 facet=true

facet.field  分组的字段

facet.prefix  表示Facet字段前缀

facet.limit   Facet字段返回条数

facet.offict  开始条数,偏移量,它与facet.limit配合使用可以达到分页的效果

facet.mincount  Facet字段最小count,默认为0

facet.missing  如果为on或true,那么将统计那些Facet字段值为null的记录

facet.sort  表示 Facet 字段值以哪种顺序返回 .格式为 true(count)|false(index,lex),true(count) 表示按照 count 值从大到小排列,false(index,lex) 表示按照字段值的自然顺序 (字母 , 数字的顺序 ) 排列 . 默认情况下为 true(count)

 

2. Date Facet

对日期类型的字段进行 Facet.  Solr 为日期字段提供了更为方便的查询统计方式 .注意 , Date Facet的字段类型必须是 DateField( 或其子类型 ). 需要注意的是 , 使用 Date Facet 时 , 字段名 , 起始时间 , 结束时间 , 时间间隔这 4 个参数都必须提供 .

facet.date  该参数表示需要进行 Date Facet 的字段名 , 与 facet.field 一样 , 该参数可以被设置多次 , 表示对多个字段进行 Date Facet.

facet.date.start 起始时间 , 时间的一般格式为 ” 2015-12-31T23:59:59Z”, 另外可以使用 ”NOW”,”YEAR”,”MONTH” 等等 ,

facet.date.end  结束时间

facet.date.gap 时间间隔,如果 start 为 2015-1-1,end 为 2016-1-1,gap 设置为 ”+1MONTH” 表示间隔1 个月 , 那么将会把这段时间划分为 12 个间隔段 .

facet.date.hardend  表示 gap 迭代到 end 时,还剩余的一部分时间段,是否继续去下一个间隔. 取值可以为 true|false, 默认为 false.

例 start 为 2015-1-1,end 为 2015-12-21,gap 为 ”+1MONTH”, 如果hardend 为 false,则,最后一个时间段为 2015-12-1 至 2016-1-1; 反之,如果 hardend 为 true,则,最后一个时间段为 2015-12-1 至 2015-12-21.

 

注意:Facet的字段必须被索引,无需分词,无需存储。无需分词是因为该字段的值代表了一个整体概念,无需存储是因为一般而言用户所关心的并不是该字段的具体值,而是作为对查询结果进行分组的一种手段,给出相关的分组信息,从而改善搜索体验。

 

Solr学习总结(三)Solr web 管理后台

前面讲到了Solr的安装,按道理,这次应该讲讲.net与数据库的内容,C#如何操作Solr索引等。不过我还是想先讲一些基础的内容,比如solr查询参数如何使用,各个参数都代表什么意思? 还有solr 自带的web 管理系统如何使用等。只有先明白了solr的基本内容,后续学习solr 的C#和数据库操作,才不会费劲。本人刚开始也是配置完solr 之后,直接找solr客户端,写相应的测试代码,但是由于不知道一个Update请求具体都需要哪些参数,各个参数都是什么意思,以至于碰到各种solr 的基础问题,都不知道问题在哪? 前车之鉴。

 

Solr web管理后台

访问主页:http://localhost:8080/solr/#/

    1. Dashboard 仪表盘,显示Solr的基本信息,包含solr版本,包含系统内存和jvm内存的使用情况,jvm参数等

    2. Logging solr的运行日志, 用来查看solr运行是否有警告或者异常,以便及时处理

 

    3. Core Admin 索引库管理,这个界面很重要,这使多核的配置,索引库的优化等,变得非常简单;
主要功能包括:Add
Core(添加核心,即索引库),Unload(卸载核心),Rename(重命名核心),Optimize(优化索引库)。

    4. Core Selector 核心选择器,选择要操作的索引库

1. Overview(概览):查看索引的情况,例如:看看Num docs数量是否增加。包含基本统计如当前文档数;和实例信息如当前核心的配置目录;

 

2. Analysis(分析):检验分词效果,用来诊断潜在的 文本分析 的查询/索引问题。注意FieldType需要选定为与被分析内容类型一致。

 

3. Query(查询):这是一个查询界面,用的比较多,用来查询索引的文档,包含是否存在,排序是否正确等。稍后会介绍相关的查询参数。

注意:如果没有做分词,相关的字段查询是精确匹配的,比如 将q 输入 title:me  即 查询title 为 me 的数据。

4. Schema(当前索引库定义),显示当前的schema的配置文件,即schema.xml的内容,例如:可以看到schema.xml 中的配置的字段等信息。

5. Documents (索引文档)索引的相关操作,增加,修改,删除等,例如我们要增加一个索引

a. 先要在solr 的D:\solr_home\mycore1\conf  的 schema.xml配置文件下,增加相关的字段field,例如:

           "title" type="string" indexed="true" stored="true" required="true" multiValued="false" />

b. 在如下页面,选择/update ,文档格式选择json ,然后submit 提交。这样 索引就增加上了。

c. 删除所以也是类似,只不过Document(s) 里面的xml一样 ,这个是删除全部的索引  *:*, 注意:这个节点不能少,否则删除动作的事务不会提交。

 

Solr学习总结(二)Solr的安装与配置

  接着前一篇,这里总结下Solr的安装与配置

 

1.准备

    1.安装Java8 和 Tomcat9 ,java和tomcat 的安装这里不再重复。需要注意的是这两个的版本兼容问题。貌似java8 不支持,tomcat7 以下版本。

2.下载 solr安装包,目前的最新版本是  5.3.1

下载地址:http://www.apache.org/dyn/closer.lua/lucene/solr/5.3.1

 

  2.安装

    1.  将 solr 压缩包解压,并将solr-5.3.1\server\solr-webap文件夹下有webapp文件夹,将之复制到Tomcat\webapps\目录下,并改成solr

 

2.  将 solr 压缩包中 solr-5.3.0\server\lib\ext 中的 jar 全部复制到 Tomcat\ webapps\solr\WEB-INF\lib 目录中

 

3.  将 solr 压缩包中 solr-5.3.0/ server/resources /log4j.properties 复制到Tomcat\ webapps\solr\WEB-INF\lib 目录中

 

4.  创建一个D:\solr_home 的目录,并将 solr 压缩包中 solr-5.3.0/server/solr 目录复制D:\solr_home目录下

5.  打开Tomcat/webapps/solr/WEB-INF下的web.xml,增加如下配置内容(初始状态下该内容是被注释掉的):

       solr/home
       D:/solr_home
       java.lang.String

将中的内容改成你的solrhome路径,这里是D:/solr_home

这项配置,主要是建立tomcat 与solr之间的关系的,它的作用是让tomcat找到你所配置的solr 目录。

 

    6.重新启动tomcat,在浏览器输入http://localhost:8080/solr 即可出现Solr的管理界面

     

 

注意:本人刚开始 http://localhost:8080/solr/ 页面无法访问。出现如下异常:

解决方法:将solr解压开的文件夹dist中jar包和contrib\velocity\lib 下的jar包都拷贝到 Tomcat\webapps\solr\WEB-INF\lib目录下。

 

    7. 配置collection,在D:\solr_home目录下, 创建一个目录mycore1, 将D:\solr_home\configsets\basic_configs\conf 下的所有文件拷贝到D:\solr_home\ mycore1\conf下

    8. 在D:\solr_home目录下, 创建文件core.properties, 并编辑文件

name= mycore1

     

    9.访问页面http://localhost:8080/solr, 查看core Admin, ‘mycore1’ 就显示出来了

     

    到这里 solr 基本就安装成功了。

Solr学习总结(一)Solr介绍

最近一直在搞Solr的问题,研究Solr 的优化,搜索引擎的bug修改等,这几天终于有时间,闲下来总结分享,以便大家参考,与大家一起来共同学习。

 

Solr是一个基于Lucene的全文搜索引擎,同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,实现了可配置、可扩展并对查询性能进行了优化,更灵活的配置,更高的查询效率。支持 XML/HTTP协议 ;支持 JSON API 接口;支持缓存、复制;同时具有完善的Web管理界面,是一款非常优秀的全文搜索引擎。

 

Solr对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML/JSON文件,生成索引;也可以通过Http Get操作执行查询请求,并以XML/JSON格式的返回结果。

 

  Solr的特性包括:

1.高级的全文搜索功能

2.专为高通量的网络流量进行的优化

3.基于开放接口(XML和HTTP)的标准

4.综合的HTML管理界面

5.可伸缩性-能够有效地复制到另外一个Solr搜索服务器

6.使用XML配置达到灵活性和适配性

7.可扩展的插件体系

 

  Solr 官网:http://lucene.apache.org/solr/

 

Solr应该是电商企业的标配。目前大部分电商网站的全文搜索引擎都是基于Solr 的。下面就一步一步跟大家介绍Solr 的安装与使用。