zoukankan      html  css  js  c++  java
  • solr(五、IK分词器集成)

    IK分词器下载地址:https://search.maven.org/search?q=com.github.magese

    我使用的是8.3版本。

    配置

    1.将下载好的jar包放在serversolr-webappwebappWEB-INFlib文件夹下面。

    2.在WEB-INF下新建文件夹classes文件夹,将jar包中解压出来的IKAnalyzer.cfg.xml文件复制过去。

    3.配置schema

    <fieldType name="ik_word" class="solr.TextField">
      <analyzer type="index">
          <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
          <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
          <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
          <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

    或者调用schemaAPI

    调用地址:http://localhost:8983/solr/c2/schema

    {
        "add-field-type": {
            "name": "text_ik",
            "class": "solr.TextField",
            "indexAnalyzer": {
                "tokenizer": {
                    "class": "org.wltea.analyzer.lucene.IKTokenizerFactory",
                    "useSmart":"false",
                    "conf": "ik.conf"
                },
                "filters": [
                    {
                        "class": "solr.LowerCaseFilterFactory"
                    }
                ]
            },
            "queryAnalyzer": {
                "tokenizer": {
                    "class": "org.wltea.analyzer.lucene.IKTokenizerFactory",
                    "useSmart":"true",
                    "conf": "ik.conf"
                },
                "filters": [
                    {
                        "class": "solr.LowerCaseFilterFactory"
                    }
                ]
            }
        }
    }

    期间如果有包class找不到的问题,重启solr即可解决问题。

     如上图可看到,分词器已经配置成功。

    高亮设置

    这里写demo的时候遇到一个问题,程序中注入SolrClient(单机模式)的时候没有问题,但是注入CloudSolrClient的时候却报错:无法注入cloudSolrClient。

    解决方法:

    在类名上加上

    @SuppressWarnings("all")
    @Scope("prototype")

    第一个注解取消代码的报错,第二个注解则是多例模式

    推测:因为solr集群的客户端注入时,是没有指定集合的,而springmvc中默认是singleton单例模式,我们需要改成多例模式以便使用多集合的solrcloud操作。

    代码

    @PostMapping("findSolr")
        public List<Book> findSolr(@RequestBody Map map) throws IOException, SolrServerException {
            String bookDescroption = (String) map.get("bookDescroption");
            SolrQuery solrQuery = new SolrQuery();
            solrQuery.setQuery("bookDescroption:"+bookDescroption);
            //高亮显示
            solrQuery.setHighlight(true);
            //设置高亮显示的域
            solrQuery.addHighlightField("bookDescroption");
            //高亮显示的前缀
            solrQuery.setHighlightSimplePre("<font color='red'>");
            //高亮显示的后缀
            solrQuery.setHighlightSimplePost("</font>");
            solrQuery.setFilterQueries("bookPrice:[10 TO 15]");
            solrQuery.setStart(0);
            solrQuery.setRows(20);
            solrQuery.addSort("id", SolrQuery.ORDER.asc);
            cloudSolrClient.setDefaultCollection("c2");
            QueryResponse queryResponse = cloudSolrClient.query(solrQuery);
            if(queryResponse!=null){
                List<Book> books = new ArrayList<>();
                SolrDocumentList solrDocuments = queryResponse.getResults();
                Map<String, Map<String, List<String>>> highLightMap = queryResponse.getHighlighting();
                for (SolrDocument solrDocument:solrDocuments){
                    List<String> highLights = highLightMap.get(solrDocument.get("id")).get("bookDescroption");
                    if(!CollectionUtils.isEmpty(highLights)){
                        solrDocument.setField("bookDescroption",highLights.get(0));
                        Book book = JSONObject.parseObject(JSONObject.toJSONString(solrDocument),Book.class);
                        books.add(book);
                    }
                }
                //List<Book> books = queryResponse.getBeans(Book.class);
                return books;
            }
            return null;
        }

    效果

    自己用vue写了一个简单的测试页面

    <div>
      <input type="text" v-model="bookDescroption"><button @click="ss">点击</button>
      <div v-html="message"></div>
    </div>
    
    
    
    methods: {
        async ss () {
          let data = {
            'bookDescroption': this.bookDescroption
          }
          let res = await this.$http.post('user/findSolr', data)
          this.message = "<ol>"
          for(var i=0;i<res.length;i++){
            this.message = this.message + "<li>"+res[i].bookDescroption+"</li>"
          }
          this.message = this.message + "</ol>"
          console.log(this.message);
        }
      },

  • 相关阅读:
    二维数组传递参数问题
    常用软件
    mybatis项目采用mybatis-plus开发,报:Invalid bound statement (not found) 异常,详细解决方案
    PowerDesigner一键导出数据库设计表结构
    微信即将有自己的输入法,真的是要保护用户隐私吗?
    字段解析之OopMapBlock(4)
    字段解析(3)
    字段解析之伪共享(2)
    字段解析(1)
    常量池解析(2)
  • 原文地址:https://www.cnblogs.com/Unlimited-Blade-Works/p/12515689.html
Copyright © 2011-2022 走看看