solr学习(五、IK分词器集成)

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

我使用的是8.3版本。

配置

1.将下载好的jar包放在server\solr-webapp\webapp\WEB-INF\lib文件夹下面。

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);
    }
  },

猜你喜欢

转载自www.cnblogs.com/Unlimited-Blade-Works/p/12515689.html