zoukankan      html  css  js  c++  java
  • Solr入门(一)


    一丶Solr入门
    1.Solr的启动
    Solr各版本下载
    老版本的时候,需要将war包放到tomcat中,现在只需解压,由于自带jetty容器,可以直接启动

     1 [root@aaa bin]# ./solr start -force -p 8983
     2 *** [WARN] *** Your open file limit is currently 1024.
     3 It should be set to 65000 to avoid operational disruption.
     4 If you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to
     5 false in your profile or solr.in.sh
     6 *** [WARN] *** Your Max Processes Limit is currently 15156.
     7 It should be set to 65000 to avoid operational disruption.
     8 If you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to
     9 false in your profile or solr.in.sh
    10 Waiting up to 180 seconds to see Solr running on port 8982 [/]
    11 Started Solr server on port 8982 (pid=4336). Happy searching!

    Windos启动:

    打开页面发现创建不了Core


    官方提供的配置文件在 solr-7.5.0/server/solr/configsets/_default,将该目录下的conf文件夹放到复制到我们新建的Core(new_core),上图所示的test目录在solr-7.5.0/server/solr/new_core,复制过去后,我们再去界面是新建一个testCore就可以创建


    新建完,有这些路径

    [root@aaa new_core]# ll
    
    total 12
    
    drwxr-xr-x 3 root root 4096 Apr 13 01:23 conf
    
    -rw-r--r-- 1 root root  131 Apr 13 01:24 core.properties
    
    drwxr-xr-x 5 root root 4096 Apr 13 01:24 data

    2.Solr的页面详解

    • Dashboard

      • 仪表盘,显示了该Solr实例开始启动运行的时间、版本、系统资源、jvm等信息。

    • Logging

      • Solr运行日志信息。

    • Core Admin

      • Solr Core的管理界面。在这里可以添加SolrCore实例。

    • java properties

      • Solr在JVM 运行环境中的属性信息,包括类路径、文件编码、jvm内存设置等信息。

    • Tread Dump

      • 显示Solr Server中当前活跃线程信息,同时也可以跟踪线程运行栈信息。

    • Core selector (重点)

      • 一个SolrCore进行详细操作

        • Analysis(重点)

        • 通过此界面可以测试索引分析器和搜索分析器的执行情况。

          注:solr中,分析器是绑定在域的类型中的

        • dataimport

          可以定义数据导入处理器,从关系数据库将数据导入到Solr索引库中。

          默认没有配置,需要手工配置。注: 后面会提到配置文件

        • Document

          通过/update表示更新索引,solr默认根据id(唯一约束)域来更新Document的内容,如果根据id值搜索不到id域则会执行添加操作,如果找到则更新。

          通过此菜单可以创建索引、更新索引、删除索引等操作,界面如下:

        •  

          <!--l overwrite="true" : solr在做索引的时候,如果文档已经存在,就用xml中的文档进行替换-->

          <!--l ommitWithin="1000" : solr 在做索引的时候,每个1000(1秒)毫秒,做一次文档提交。为了方便测试也可以在Document中立即提交,</doc>后添加“<commit/>”-->

           

        • Query(重点)

    注: 常见的查询条件,链接--> 查询

    3.Solr的配置文件

    3.1managed-schema

    注:以前的旧版本的时候,配置文件叫schema.xml

     1 [root@192 conf]# pwd
     2 /mnt/solr-7.5.0/server/solr/test_core/conf
     3 [root@192 conf]# ll
     4 total 132
     5 drwxr-xr-x 2 root root  4096 Apr 13 08:24 lang
     6 -rw-r--r-- 1 root root 55728 Apr 13 08:59 managed-schema
     7 -rw-r--r-- 1 root root   308 Apr 13 08:24 params.json
     8 -rw-r--r-- 1 root root   873 Apr 13 08:24 protwords.txt
     9 -rw-r--r-- 1 root root 53959 Apr 13 08:24 solrconfig.xml
    10 -rw-r--r-- 1 root root   781 Apr 13 08:24 stopwords.txt
    11 -rw-r--r-- 1 root root  1124 Apr 13 08:24 synonyms.txt
    12 [root@192 conf]#

            3.1.1   Filed   定义域

    • Name:指定域的名称 一般映射成表里面的字段

    • Type:指定域的类型

    • Indexed:是否索引

    • Stored:是否存储

    • Required:是否必须

    • multiValued:是否多值,比如商品信息中,一个商品有多张图片,一个Field像存储多个值的话,必须将multiValued设置为true。

    3.1.2 dynamicField 动态域

        

    • Name:指定动态域的命名规则 类型模糊匹配

    3.1.3 uniqueKey

    • <uniqueKey>id</uniqueKey>

    其中的id是在Field标签中已经定义好的域名,而且该域要设置为required为true。一个配置文件中必须有且仅有一个唯一键。

    3.1.4 copyField

         

    • Source:要复制的源域的域名

      Dest:目标域的域名

      由dest指的的目标域,必须设置multiValued为true

      3.1.5FiledType

    3.1.5 FieldType

          

    • Name:指定域类型的名称

             Class:指定该域类型对应的solr的类型

             Analyzer:指定分析器

             Type:index、query,分别指定搜索和索引时的分析器

             Tokenizer:指定分词器

    4.IK分词器

    IK下载 密码:igt9。

    • 将两个jar包复制到该路径: solr-7.5.0serversolr-webappwebappWEB-INFlib

    • 另外将三个配置文件复制到该路径: solr-7.5.0serversolr-webappwebappWEB-INFclasses。如果没有classes文件夹就新建一个。

    • 在schema中添加分词器。

     1 <!-- 我添加的IK分词 -->
     2  <fieldType name="text_ik" class="solr.TextField">
     3      <analyzer type="index">
     4          <tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/>
     5      </analyzer>
     6      <analyzer type="query">
     7          <tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/>
     8      </analyzer>
     9  </fieldType>
    10     
    11 <!-- 继续添加业务域  -->
    12    <field name="item_title" type="text_ik" indexed="true" stored="true"/>
    13    <field name="item_sell_point" type="text_ik" indexed="true" stored="true"/>
    14    <field name="item_price"  type="plong" indexed="true" stored="true"/>
    15    <field name="item_image" type="string" indexed="false" stored="true" />
    16    <field name="item_category_name" type="string" indexed="true" stored="true" />
    17    <field name="item_desc" type="text_ik" indexed="true" stored="false" />
    18   
    19    <field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
    20    <copyField source="item_title" dest="item_keywords"/>
    21    <copyField source="item_sell_point" dest="item_keywords"/>
    22    <copyField source="item_category_name" dest="item_keywords"/>
    23    <copyField source="item_desc" dest="item_keywords"/>   
    • 重启Solr。

     

     注:这边没有出来结果,不明白为什么。但是windows版的就成功了

    5.Solr简单实用

    5.1 根据业务配置filed

    1 <!--product-->
    2 <field name="product_name" type="text_ik" indexed="true" stored="true"/>
    3 <field name="product_catalog" type="string" indexed="true" stored="true"/>
    4 <field name="product_catalog_name" type="string" indexed="true" stored="true" />
    5 <field name="product_price"  type="pfloat" indexed="true" stored="true"/>
    6 <field name="product_description" type="text_ik" indexed="true" stored="false" />
    7 <field name="product_picture" type="string" indexed="false" stored="true" />
    8 <field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>

    注:现在高本版的int、float要进一个p字母

    5.2引入jar包

    • Mysql的驱动包

    • 把这3个jar包拷贝到 solrserversolr-webappwebappWEB-INFlib 下

    5.3solrconfig.xml文件配置

    <requestHandler name="/dataimport"
         class="org.apache.solr.handler.dataimport.DataImportHandler"> 
           <lst name="defaults"> 
              <str name="config">data-config.xml</str> 
           </lst> 
    </requestHandler>
    在第一个requestHandler下面,加入这段。

    5.4创建data-config.xml文件

    <?xml version="1.0" encoding="UTF-8" ?>  
    <dataConfig>   
    <dataSource type="JdbcDataSource"   
              driver="com.mysql.jdbc.Driver"   
              url="jdbc:mysql://localhost:3306/solr"   
              user="root"   
              password="root"/>   
    <document>   
        <entity name="product" query="SELECT pid,name,catalog,catalog_name,price,description,picture FROM products ">
             <field column="pid" name="id"/> 
             <field column="name" name="product_name"/> 
    <field column="catalog" name="product_catalog"/>
             <field column="catalog_name" name="product_catalog_name"/> 
             <field column="price" name="product_price"/> 
             <field column="description" name="product_description"/> 
             <field column="picture" name="product_picture"/> 
        </entity>   
    </document>   
    </dataConfig>
    • dataSource不多说,一看就明白

    • entity --代表数据库表

    • column--代表数据库表字段

    • name--代表solr中字段名

    5.5重启Solr

    导入数据。

    6.Solrj的使用

    6.1查询

    @Test
        public void search01() throws Exception {
            // 创建HttpSolrServer
            HttpSolrServer server = new                        HttpSolrServer("http://localhost:8983/solr/test_core");
            // 创建SolrQuery对象
            SolrQuery query = new SolrQuery();
            // 输入查询条件
            query.setQuery("product_name:小黄人");
            // 执行查询并返回结果
            QueryResponse response = server.query(query);
            // 获取匹配的所有结果
            SolrDocumentList list = response.getResults();
            // 匹配结果总数
            long count = list.getNumFound();
            System.out.println("匹配结果总数:" + count);
            for (SolrDocument doc : list) {
                System.out.println(doc.get("id"));
                System.out.println(doc.get("product_name"));
                System.out.println(doc.get("product_catalog"));
                System.out.println(doc.get("product_price"));
                System.out.println(doc.get("product_picture"));
                System.out.println("=====================");
            }
        }
    -- 注:URL那里要加上那个core,不然会报错,之前研究4.xx版本的时候,没有这个问题
    查询结果:
    匹配结果总数:122
    4403
    家天下小黄人美耐瓷卡通儿童筷-黄色筷子
    47
    5.5
    2014032515340838.png
    =====================
    4404
    家天下小黄人美耐瓷卡通儿童筷-蓝色筷子
    47
    5.5
    2014032515284014.png
    =====================
    3
    神偷奶爸电影同款&nbsp;惨叫发泄公仔&nbsp;发声小黄人
    17
    10.0
    2014032417271233.png
    =====================
    4
    神偷奶爸电影同款&nbsp;&nbsp;发泄公仔&nbsp;暴眼小黄人
    17
    13.0
    2014032416533215.png
    =====================
    2054
    家天下高保真翻开书页创意小音箱便携小音响SL23
    28
    18.0
    2011120313192588_S.jpg
    =====================
    125
    迷你随身小扑克CL-1902
    17
    3.0
    2011042711514296.jpg
    =====================
    895
    家天下南韩小夹子黑板
    20
    0.93
    2009110217233545.jpg
    =====================
    1941
    家天下法式小酒桶打火机
    25
    6.8
    2011041917513362_S.jpg
    =====================
    3199
    好酷仔迷你小风扇
    30
    7.5
    2013041714005875_S.jpg
    =====================
    195
    家天下小酒窝青蛙情侣挂钩
    17
    3.2
    2009080314562507.jpg
    =====================

    6.2复杂查询

     1 @Test
     2     public void search02() throws Exception {
     3         // 创建HttpSolrServer
     4         HttpSolrServer server = new HttpSolrServer("http://localhost:8983/solr/test_core");
     5         // 创建SolrQuery对象
     6         SolrQuery query = new SolrQuery();
     7  8         // 输入查询条件
     9         query.setQuery("product_name:小黄人");
    10         // query.set("q", "product_name:小黄人");
    11 12         // 设置过滤条件
    13         // 如果设置多个过滤条件的话,需要使用query.addFilterQuery(fq)
    14         query.setFilterQueries("product_price:[1 TO 10]");
    15 16         // 设置排序
    17         query.setSort("product_price", ORDER.asc);
    18         // 设置分页信息(使用默认的)
    19         query.setStart(0);
    20         query.setRows(5);
    21 22         // 设置显示的Field的域集合
    23         query.setFields("id,product_name,product_catalog,product_price,product_picture");
    24 25         // 设置默认域
    26         query.set("df", "product_keywords");
    27 28         // 设置高亮信息
    29         query.setHighlight(true);
    30         query.addHighlightField("product_name");
    31         query.setHighlightSimplePre("<em>");
    32         query.setHighlightSimplePost("</em>");
    33 34         // 执行查询并返回结果
    35         QueryResponse response = server.query(query);
    36         // 获取匹配的所有结果
    37         SolrDocumentList list = response.getResults();
    38         // 匹配结果总数
    39         long count = list.getNumFound();
    40         System.out.println("匹配结果总数:" + count);
    41 42         // 获取高亮显示信息
    43         Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
    44         for (SolrDocument doc : list) {
    45             System.out.println(doc.get("id"));
    46 47             List<String> list2 = highlighting.get(doc.get("id")).get("product_name");
    48             if (list2 != null)
    49                 System.out.println("高亮显示的商品名称:" + list2.get(0));
    50             else {
    51                 System.out.println(doc.get("product_name"));
    52             }
    53 54             System.out.println(doc.get("product_catalog"));
    55             System.out.println(doc.get("product_price"));
    56             System.out.println(doc.get("product_picture"));
    57             System.out.println("=====================");
    58         }
    59     }
    60
    匹配结果总数:81
    3741
    高亮显示的商品名称:家天下正品达贺纤长睫毛<em>小</em>帮手1029立体水晶睫毛卡
    33
    1.15
    20080816114400873.jpg
    =====================
    862
    高亮显示的商品名称:家天下南韩<em>小</em>夹子黑板新版
    20
    1.5
    2011071109133007_S.jpg
    =====================
    4675
    高亮显示的商品名称:家天下甜心柄美耐瓷<em>小</em>汤勺1105-47
    1.6
    2010011214065760.jpg
    =====================
    4676
    高亮显示的商品名称:家天下甜心柄美耐瓷<em>小</em>汤勺1105-47
    1.6
    2010011214062611.jpg
    =====================
    4677
    高亮显示的商品名称:家天下甜心柄美耐瓷<em>小</em>汤勺1105-绿
    47
    1.6
    2010011214045423.jpg
    =====================

    6.3增加索引

     1  @Test
     2     public void insertAndUpdateIndex() throws Exception {
     3         // 创建HttpSolrServer
     4         HttpSolrServer server = new HttpSolrServer("http://localhost:8983/solr/test_core");
     5         // 创建Document对象
     6         SolrInputDocument doc = new SolrInputDocument();
     7         doc.addField("id", "c001");
     8         doc.addField("name", "solr test111");
     9         // 将Document对象添加到索引库
    10         server.add(doc);
    11         // 提交
    12         server.commit();
    13     }
    14 {
    15   "responseHeader":{
    16     "status":0,
    17     "QTime":8,
    18     "params":{
    19       "q":"name:solr test111",
    20       "_":"1555242778361"}},
    21   "response":{"numFound":1,"start":0,"docs":[
    22       {
    23         "id":"c001",
    24         "name":["solr test111"],
    25         "_version_":1630790213324242944}]
    26   }}

    6.4删除索引

     1   @Test
     2     public void deleteIndex() throws Exception {
     3         // 创建HttpSolrServer
     4         HttpSolrServer server = new HttpSolrServer("http://localhost:8983/solr/test_core");
     5  6         // 根据指定的ID删除索引
     7         // server.deleteById("c001");
     8  9         // 根据条件删除
    10         server.deleteByQuery("id:c001");
    11 12         // 删除全部(慎用)
    13         // server.deleteByQuery("*:*");
    14 15         // 提交
    16         server.commit();
    17     }

     

    已经被删除,就找不到了

    附:Solr查询用法

    • q - 查询关键字,必须的,如果查询所有使用:

           请求的q是字符串

    • fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如::

                请求fq是一个数组(多个值)

                

              过滤查询价格从1到20的记录。也可以在“q”查询条件中使用product_price:[1 TO 20],如下:

               也可以使用“*”表示无限,例如:

              20以上:product_price:[20 TO *]

              20以下:product_price:[* TO 20]

              

    • sort - 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:

      按价格降序

             

    • start - 分页显示使用,开始记录下标,从0开始

    • rows - 指定返回结果最多有多少条记录,配合start来实现分页。

                 实际开发时,知道当前页码和每页显示的个数最后求出开始下标。

    • fl - 指定返回那些字段内容,用逗号或空格分隔多个。

               

                显示商品图片、商品名称、商品价格

    • df-指定一个搜索Field

           也可以在SolrCore目录 中conf/solrconfig.xml文件中指定默认搜索Field,指定后就可以直接在“q”查询条件中输入关键字。

            

    • wt - (writer type)指定输出格式,可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开。

    • hl 是否高亮 ,设置高亮Field,设置格式前缀和后缀。

     

  • 相关阅读:
    敲七
    二维指针数组**p
    食物链(待解决)
    蛇行矩阵
    快速排序 QuickSort
    堆排序
    猪的安家
    百度语言翻译机
    HTML <base> 标签
    免费网络管理流量监控软件大比拼
  • 原文地址:https://www.cnblogs.com/dalianpai/p/11671722.html
Copyright © 2011-2022 走看看