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.0\server\solr-webapp\webapp\WEB-INF\lib

  • 另外将三个配置文件复制到该路径: solr-7.5.0\server\solr-webapp\webapp\WEB-INF\classes。如果没有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包拷贝到 solr\server\solr-webapp\webapp\WEB-INF\lib 下

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,设置格式前缀和后缀。

 

posted @ 2019-10-14 15:28  天宇轩-王  阅读(459)  评论(0编辑  收藏  举报