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