品优购项目笔记(四):全文检索引擎系统solr

solr

什么是solr

solr是一个apache的全文检索引擎系统, 就是个war包, 部署到Tomcat下就可以独立运行, 我们使用它的客户端工具包solrj来远程调用solr服务器, 完成对索引库的操作(对索引库的添加修改删除, 查询),solr底层使用lucene编写.

作用:
对于大数据量搜索或者是查询, 速度非常快, 并且不会随着数据量的增大而减缓查询速度.主要应用于大型的互联网项目中, 做大规模数据查询.

solr同类型技术:
elasticsearch是solr的同类型技术, elasticsearch在搜索的时候速度比solr要快.但是使用起来比solr要复杂,企业中现在elasticsearch比较流行

全文检索算法(倒排索引表算法):

  • 使用场景: 大数据量搜索查询, 例如: 京东, 天猫的搜索功能.
  • 描述: 查询前先将查询的内容抽取出来组成文档(document), 也就相当于字典的正文, 然后进行切分词, 将切分出来的词组成索引(index)相当于字段的目录, 查询的时候先查询索引根据索引找文档, 这个过程叫做全文检索
  • 总结: 和字典原理一样.
  • 优点: 查询速度快, 并且不会随着查询的数据量增大而变慢, 查询结果精确
    缺点: 索引会额外占用大量的磁盘空间.

顺序扫描法:

  • 使用场景: 数据库中的like模糊查询就是用的这种算法
  • 描述: 拿着需要查询的关键字, 到内容中逐字逐行的对比, 直到查询内容结束
  • 优点: 查询准确
    缺点: 查询速度慢, 并且会随着查询内容量增大越来越慢.

切分词: 将一句一句话, 切分成一个一个词, 去掉停用词(的, 地得, a,an,the等), 去掉空格和标点符号, 大写字母全部转成小写字母.

solr部署步骤

1. 在/usr/local目录下创建solr文件夹
2. 复制solr安装包, ik分词器包, tomcat包到这个目录下, 并且解压
3. 将solr/example/webapps/solr.war复制到tomcat/webapps目录下
4. 启动tomcat目的是对war包解压, 解压完成后关闭tomcat
5. 到tomcat/webapps目录中删除solr.war
6. 复制solr/example/lib/ext下的所有到 tomcat/webapps/solr/WEB-INf/lib目录下
7. 复制solr/example/solr目录到 /usr/loca/solr目录下并且改名问solrhome
8. 配置solrhome的位置到tomcat/webapps/solr/WEB-INF/web.xml中
9. 启动tomcat, 浏览器访问http://服务器地址:端口/solr看到solr页面后证明部署成功

什么是solrhome

solrhome就是solr的家, 一个solr服务器只能有一个solrhome, 一个solrhome中可以有多个solr实例, 里面的collection1文件夹就是默认的solr实例, 一个solrhome中可以同时有多个实例, 实例中有索引库, 实例和实例之间是互相隔离的.

solr中添加实例

一、进入solrhome文件夹,然后拷贝collection1到collection2

二、编辑collection2中的core.properties中的值为collection2
在这里插入图片描述

三、保存,重启tomcat

solr中添加数据

在这里插入图片描述
注意:

  1. 域名要先定义后使用, 没有定义的域名直接使用会报错
ERROR: [doc=002] unknown field 'sadfasdfasdfasdf'
  1. solr中添加数据的时候必须有主键域id, 没有会报错
Document is missing mandatory uniqueKey field: id"
  1. solr中没有修改方法, 添加就是修改, 修改就是添加, 每次修改数据的时候, 都是根据id主键先去查询,如果查到了, 将原有数据删除, 将新数据添加进去, 这就是修改, 如果没有根据id查询到数据, 则直接添加, 就成了添加.

  2. 删除(XML格式)

根据id删除

<delete>
<query>id: 002</query>
</delete>
<commit/>

删除所有:

<delete>
<query>*:*</query>
</delete>
<commit/>

域的分类

solr中域的作用:自定义域名和类型就是为了保存数据库表中一列一列的数据, 表中的列名要和索引库的域名对应

solr中域的分类:

  • field普通域: 大多数情况都可以用这个域来完成, 主要定义了域名和域的类型.
 <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
  • dynamicField动态域: solr中域名要先定义后使用, 没有定义就使用会报错, 如果没有定义的域名想使用可以模糊匹配动态域, 让没有定义的域名可以使用.
 <dynamicField name="*_is" type="int"    indexed="true"  stored="true"  multiValued="true"/>
  • uniqueKey主键域: 在添加数据的时候必须有主键域, 没有会报错, 这个不用添加也不用修改, 就使用这个默认的域名id就可以.
<uniqueKey>id</uniqueKey>
  • copyField复制域: 复制域中有source叫做源域, dest代表目标域, 在维护数据的时候, 源域中的内容会复制到目标域中一份, 从目标域中搜索, 就相当于从多个源域中搜索一样.
<copyField source="cat" dest="text"/>

集成中文分词器

ik中文分词器:
作用: 有中文语义分析的效果, 对中文分词效果好.
配置文件:

  • stopword.dic停止词典: 且分词的时候, 凡是出现在停止词典中的词都会被过滤掉.
  • ext.dic扩展词典: 凡是专有名词都会放到这里, 如果自然语义中不是一个词, 放到这里后solr切分词的时候就会切分成一个词.

一、集成
在这里插入图片描述
二、在schema.xml中添加一个自定义的fieldType,使用中文分析器。

<!-- IKAnalyzer-->
    <fieldType name="text_ik" class="solr.TextField">
      <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
    </fieldType>

三、在schema.xml中添加field,指定field的type属性为text_ik

<!--IKAnalyzer Field-->
<field name="content_ik" type="text_ik" indexed="true" stored="true" /> 

四、重启tomcat,测试
在这里插入图片描述

自定义业务域

创建数据库表,添加数据,将有用的列名作为域。

<!--product-->
<field name="product_name" type="text_ik" indexed="true" stored="true"/>
<field name="product_price"  type="float" indexed="true" stored="true"/>
<field name="product_description" type="text_ik" indexed="true" stored="false" />
<field name="product_picture" type="string" indexed="false" stored="true" />
<field name="product_catalog_name" type="string" indexed="true" stored="true" />

<field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="product_name" dest="product_keywords"/>
<copyField source="product_description" dest="product_keywords"/>

solrj

在这里插入图片描述
solrJ是solr官方推出的客户端工具包, 将solrj的jar包放到我们项目中, 我们调用solrj中的api来远程给solr服务器发送命令, solr服务器就可以完成对索引库的操作(添加修改删除查询)

solr增删改

添加jar包
在这里插入图片描述
增加(修改)、删除

public class TestIndexManager {
    @Test
    public void testIndexCreateAndUpdate() throws Exception {
        /**
         * 创建solr服务器连接
         * http://192.168.200.128:8080/solr 连接的是默认实例,即collection1
         * http://192.168.200.128:8080/solr/collection2
         */
        SolrServer solrServer = new HttpSolrServer("http://192.168.200.128:8080/solr");
        //创建文档对象
        SolrInputDocument doc = new SolrInputDocument();
        doc.addField("id","001");
        doc.addField("title","三国演义");
        //添加或修改
        solrServer.add(doc);
        //提交
        solrServer.commit();
    }

    @Test
    public void testIndexDelete() throws Exception {
        /**
         * 创建solr服务器连接
         * http://192.168.200.128:8080/solr 连接的是默认实例,即collection1
         * http://192.168.200.128:8080/solr/collection2
         */
        SolrServer solrServer = new HttpSolrServer("http://192.168.200.128:8080/solr");
        /**
         * 删除一个
         */
        //solrServer.deleteById("001");
        /**
         * 条件删除:删除所有
         */
        solrServer.deleteByQuery("*:*");
        //提交
        solrServer.commit();
    }
}

solr查询

public class TestIndexSearch {
    @Test
    public void testIndexSearch() throws Exception {
        /**
         * 创建solr服务器连接
         * http://192.168.200.128:8080/solr 连接的是默认实例,即collection1
         * http://192.168.200.128:8080/solr/collection2
         */
        SolrServer solrServer = new HttpSolrServer("http://192.168.200.128:8080/solr");
        //创建查询对象
        SolrQuery solrQuery = new SolrQuery();
        solrQuery.setQuery("*:*");
        //查询并返回相应
        QueryResponse query = solrServer.query(solrQuery);
        //从响应中获取结果集
        SolrDocumentList results = query.getResults();
        System.out.println(results.getNumFound());
        for (SolrDocument result : results) {
            System.out.println(result.get("id"));
            System.out.println(result.get("title"));
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值