• 浅谈solr


    Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。

    Solr是一个高性能,采用Java5开发,

    SolrSolr

    基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎

    下面我们来看看如何使用solr:

    1. 解压下载的压缩包,solr 不需要使用Tomcat启动,自带jetty,(我会在文末注上solr下载地址:无需去官网翻墙---慢的一比- -)
    2. window运行cmd 找到solr解压后的目录:  bin/solr.cmd start,solr默认端口为8983  出现如右图所示,即可,表明solr已经启动完毕。                
    3. 访问:http://localhost:8983/solr/ 出现如下页面:
    • solr 配置
    1. 创建core,cmd命令为:solr.cmd create -c articles。其中articles是core的名称,可以自定义。

            2. 重启solr:solr restart -p 8983 

          3. 查看core:打开solr控制台,点击"Core Admin",列表中出现"articles",说明core创建成功

    4. 测试分词,选择刚才创建的core,点击Analysis进入分词分析页面,输入要分词的句子,选择分词库,点击分析按钮,即可看到分词结果

    solr默认是不支持中文分词的,然而solr已经自带了中文分词的jar包。

    中文分词插件配置
    添加中文分词插件:solr 7.3中自带中文分词插件,将solr-7.3.1contribanalysis-extraslucene-libslucene-analyzers-smartcn-7.3.1.jar 复制到 solr-7.3.1serversolr-webappwebappWEB-INFlib 目录中
    配置中文分词,修改 solr-7.3.1serversolrarticles【创建的core的名称】confmanaged-schema文件,添加中文分词

     <!-- Chinese -->
        <fieldType name="text_cn" class="solr.TextField" positionIncrementGap="100">
          <analyzer type="index">
            <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
          </analyzer>
          <analyzer type="query">
            <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
          </analyzer>
        </fieldType>

    搜索Italian,在Italian下添加我们的中文配置

    重启solr,测试中文分词 重启命令 :solr restart -p 8983 

    至此solr已经配置完毕,接下来是在项目中的简单应用:

    找到如下路径的配置文件,notepad++打开

    H:solr-6.2.0serversolrarticlesconfmanaged-schema

    然后maven项目中引入solrj相关jar包:

    <dependency>
        <groupId>org.apache.solr</groupId>
        <artifactId>solr-solrj</artifactId>
        <version>5.2.0</version>
    </dependency>

    写一个测试类,代码如下:

    package com.sm.utils;
    
    import java.io.IOException;
    import java.util.List;
    
    import org.apache.solr.client.solrj.SolrQuery;
    import org.apache.solr.client.solrj.SolrServerException;
    import org.apache.solr.client.solrj.impl.HttpSolrClient;
    import org.apache.solr.client.solrj.response.QueryResponse;
    import org.apache.solr.common.SolrDocument;
    import org.apache.solr.common.SolrDocumentList;
    import org.apache.solr.common.SolrInputDocument;
    
    import com.sm.modules.xym.user.entity.XymApiUser;
    
    public class SolrUtil {
        // 指定solr服务器的地址
        private final static String SOLR_URL = "http://localhost:8983/solr/";
    
        /**
         * 创建SolrServer对象
         * 
         * 该对象有两个可以使用,都是线程安全的 1、CommonsHttpSolrServer:启动web服务器使用的,通过http请求的 2、
         * EmbeddedSolrServer:内嵌式的,导入solr的jar包就可以使用了 3、solr
         * 4.0之后好像添加了不少东西,其中CommonsHttpSolrServer这个类改名为HttpSolrClient
         * 
         * @return
         */
        public HttpSolrClient createSolrServer() {
            HttpSolrClient solr = null;
            solr = new HttpSolrClient(SOLR_URL);
            return solr;
        }
    
        /**
         * 往索引库添加文档
         * 
         * @throws IOException
         * @throws SolrServerException
         */
        public void addDoc() throws SolrServerException, IOException {
            // 构造一篇文档
            SolrInputDocument document = new SolrInputDocument();
            // 往doc中添加字段,在客户端这边添加的字段必须在服务端中有过定义
            document.addField("id", "8");
            document.addField("name", "周新星");
            document.addField("phoneNumber", "13613192037");
            // 获得一个solr服务端的请求,去提交 ,选择具体的某一个solr core
            HttpSolrClient solr = new HttpSolrClient(SOLR_URL + "articles");
            solr.add(document);
            solr.commit();
            solr.close();
        }
    
        /**
         * 根据id从索引库删除文档
         */
        public void deleteDocumentById() throws Exception {
            // 选择具体的某一个solr core
            HttpSolrClient server = new HttpSolrClient(SOLR_URL + "articles");
            // 删除文档
            server.deleteById("8");
            server.deleteById("82");
            // 删除所有的索引
            // solr.deleteByQuery("*:*");
            // 提交修改
            server.commit();
            server.close();
        }
    
        /**
         * 查询
         * 
         * @throws Exception
         */
        public void querySolr() throws Exception {
            HttpSolrClient solrServer = new HttpSolrClient(SOLR_URL + "articles/");
            SolrQuery query = new SolrQuery();
            // 下面设置solr查询参数
            query.set("q", "*:*");// 参数q 查询所有
            // query.set("q", "周星驰");// 相关查询,比如某条数据某个字段含有周、星、驰三个字 将会查询出来
            // ,这个作用适用于联想查询
    
            // 参数fq, 给query增加过滤查询条件
            // query.addFilterQuery("id:[0 TO 9]");// id为0-4
    
            // 给query增加布尔过滤条件
            // query.addFilterQuery("description:演员"); //description字段中含有“演员”两字的数据
    
            // 参数df,给query设置默认搜索域
            // query.set("df", "name");
    
            // 参数sort,设置返回结果的排序规则
            // query.setSort("id", SolrQuery.ORDER.desc);
    
            // 设置分页参数
            query.setStart(0);
            query.setRows(10);// 每一页多少值
    
            // 参数hl,设置高亮
            // query.setHighlight(true);
            // 设置高亮的字段
            // query.addHighlightField("name");
            // 设置高亮的样式
            // query.setHighlightSimplePre("<font color='red'>");
            // query.setHighlightSimplePost("</font>");
    
            // 获取查询结果
            QueryResponse response = solrServer.query(query);
            // 两种结果获取:得到文档集合或者实体对象
    
            // 查询得到文档的集合
            SolrDocumentList solrDocumentList = response.getResults();
            System.out.println("通过文档集合获取查询的结果");
            System.out.println("查询结果的总数量:" + solrDocumentList.getNumFound());
            // 遍历列表
            for (SolrDocument doc : solrDocumentList) {
                System.out.println(
                        "id:" + doc.get("id") + "   name:" + doc.get("name") + "    phoneNumber:" + doc.get("phoneNumber"));
            }
    
            // 得到实体对象
            List<XymApiUser> tmpLists = response.getBeans(XymApiUser.class);
            if (tmpLists != null && tmpLists.size() > 0) {
                System.out.println("通过文档集合获取查询的结果");
                for (XymApiUser per : tmpLists) {
                    System.out.println(
                            "id:" + per.getId() + "   name:" + per.getName() + "    phoneNumber:" + per.getPhoneNumber());
                }
            }
        }
    
        public static void main(String[] args) throws Exception {
            SolrUtil solr = new SolrUtil();
            solr.createSolrServer();
            // solr.addDoc();
            // solr.deleteDocumentById();
            solr.querySolr();
        }
    }

    这样还不能实现数据映射到实体类,我们最后需要在对应实体类XymApiUser.java文件为对应需要映射的字段加上@Field(“name”)注解

    这样我们执行一下main方法:

    至此solr安装及与项目的基本整合完毕。

    solr是一款基于lucene开发的相当强大全文索引工具,极大加快了查询速度,因为使用了分词,所以是精确匹配,能够让查询更简单,更灵活,值得一试。

    solr下载地址:链接: https://pan.baidu.com/s/12bno8K9VOYdn42wY0gRfzA 提取码: e8e2

  • 相关阅读:
    net-speeder 安装
    CentOS 5/6 下添加epel源
    让进程在后台可靠运行的几种方法
    学习supervisor
    SQLAlchemy tutorial
    Ubuntu包管理工具整理
    Photoshop保存文件时的选项
    python反射
    python包管理(distutils、easy_install、pip、setup.py/requirements.txt、wheel)
    python 一句话输出26个英文字母
  • 原文地址:https://www.cnblogs.com/fengwenzhee/p/9821983.html
Copyright © 2020-2023  润新知