开发人员如何快速定制化实现一个基于Solr的搜索引擎( 二 )

  • 基于统计及机器学习的分词方式优点:可以很好地处理歧义和未登录问题效果比基于字符串匹配算法更好
  • 基于统计及机器学习的分词方式缺点:需要大量的人工标注数据较慢的分词速度
  • IKAnalyzer
    • IKAnalyzer是一个开源的,基于Java语言开发的轻量级中文分词工具包
    • 基于文本匹配,不需要投入大量的人力进行训练和标注
    • 可以自定词典,方便加入特定领域的词语,能分出多粒度的结果
    部署Solr并安装IKAnalyzer
    • 创建/usr/local/Docker/solr/ikanalyzer目录
    /usr/local/docker/solr 用于存放docker-compose.yml配置文件
    /usr/local/docker/solr/ikanalyzer 用于存放Dockerfile镜像配置文件
    • docker-compose.yml
    version: '3.1'
    services:
    solr:
    build: ikanalyzer
    restart: always
    container_name: solr
    ports:
    - 8983:8983
    volumes:
    - ./solrdata:/opt/solrdata
    • Dockerfile(在/usr/local/docker/solr/ikanalyzer中需要有文件:ik-analyzer-solr5-5.x.jar,solr-analyzer-ik-5.1.0.jar,ext.dic,stopword.dic,IKAnalyzer.cfg.xml,managed-schema)
    FROM solr
    # 创建Core
    WORKDIR /opt/solr/server/solr
    RUN mkdir ik_core
    WORKDIR /opt/solr/server/solr/ik_core
    RUN echo 'name=ik_core' > core.properties
    RUN mkdir data
    RUN cp -r ../configsets/sample_techproducts_configs/conf/ .
    # 安装中文分词
    WORKDIR /opt/solr/server/solr-webApp/webapp/WEB-INF/lib
    ADD ik-analyzer-solr5-5.x.jar .
    ADD solr-analyzer-ik-5.1.0.jar .
    WORKDIR /opt/solr/server/solr-webapp/webapp/WEB-INF
    ADD ext.dic .
    ADD stopword.dic .
    ADD IKAnalyzer.cfg.xml .
    # 增加分词配置
    COPY managed-schema /opt/solr/server/solr/ik_core/conf
    WORKDIR /opt/solr
    • 构建镜像: 在/usr/local/docker/solr中执行命令
    docker-compose up -d
     
    Solr分析功能修改managed-schema配置业务系统字段
    • Solr中自带的相同字段无需再添加,其它字段需要手动添加Solr字段(通过编辑managed-schema配置文件来手动添加Solr字段)
    <!-- 字段域 -->
    <field name="tb_item_cid" type="plong" indexed="true" stored="true" />
    <field name="tb_item_cname" type="text_ik" indexed="true" stored="true" />
    <field name="tb_item_title" type="text_ik" indexed="true" stored="true" />
    <field name="tb_item_sell_point" type="text_ik" indexed="true" stored="true" />
    <field name="tb_item_desc" type="text_ik" indexed="true" stored="true" />
    <!-- 复制域:Solr的搜索优化功能,,将多个字段复制到一个域,提高查询效率 -->
    <field name="tb_item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true" />
    <copyField source="tb_item_cname" dest="tb_item_keywords">
    <copyField source="tb_item_title" dest="tb_item_keywords">
    <copyField source="tb_item_sell_point" dest="tb_item_keywords">
    <copyField source="tb_item_desc" dest="tb_item_keywords">
    复制配置到容器docker cp managed-schema solr:/opt/solr/server/solr/ik_core/conf
    重启容器docker-compose restart
    • 在Solr的Web界面可以进行CRUD操作
    SpringBoot整合Solr创建搜索服务接口
    • 创建myshop-service-search-api项目,该项目只负责定义定义接口
    • pom.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
    <groupId>com.funtl</groupId>
    <artifactId>myshop-dependencies</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <relativePath>../myshop-dependencies/pom.xml</relativePath>
    </parent>
    <artifactId>myshop-service-search-api</artifacteId>
    <packaging>jar<packaging>
    </project>
    • 在项目中创建SearchService接口
    package com.oxford.myshop.service.search.api;
    public interface SearchService {
    List<TbItemResult> search(String query,int page,int rows);
    }
    • 创建TbItemResult用于返回Solr结果集
    package com.oxford.myshop.service.search.domain;


    推荐阅读