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

浙公网安备 33010602011771号