您的位置:首页 > 其它

Solr配置中文分词器IKAnalyzer及增删改查调用

2016-03-20 17:26 627 查看
一、配置IKAnalyzer中文分词器
Solr 版本5.2.1

IKAnalyzer2012_u6.jar报错 ,用IKAnalyzer2012_FF_hf1.jar 替换可解决
解决lucene4.0与IKAnalyzer的冲突。解决Exception in thread "main" java.lang.VerifyError: class org.wltea.analyzer.lucene.IKAnalyzer overrides final method tokenStream.(Ljava/lang/String;Ljava/io/Reader;)Lorg/apache/lucene/analysis/TokenStream;原因IKAnalyzer中参考手册中的例子是使用的lucene3.4,与4.0已经是不兼容了。使用IKAnalyzer2012_FF_hf1.jar可以解决问题

java.lang.AbstractMethodError

Caused by: java.lang.AbstractMethodError
at org.apache.lucene.analysis.Analyzer.tokenStream(Analyzer.java:179)


lucene版本跟IK分词版本不一致导致,这块版本一定要对应上

由于solr版本较高暂时无法解决

<field name="messageId" type="string" indexed="true" stored="true" required="true" multiValued="false"/>
<field name="msg_title" type="text_ik" stored="true" indexed="true"/>
<field name="msg_content" type="text_ik" stored="true" indexed="true" multiValued="true"/>
<uniqueKey>messageId</uniqueKey>

<!-- IKAnalyzer 中文分词-->
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index" class="org.wltea.analyzer.lucene.IKAnalyzer" />
<analyzer type="query" class="org.wltea.analyzer.lucene.IKAnalyzer" />
</fieldType>


二、添加、删除、查询索引
需要除了solr相关包还需要下面的jar包



Message.java
package org.itat.lucene.solr.test;

import org.apache.solr.client.solrj.beans.Field;

public class Message {

private String messageId;
private String title;
private String[] content;

public Message() {
super();
}

public Message(String messageId, String title, String[] content) {
super();
this.messageId = messageId;
this.title = title;
this.content = content;
}

public String getMessageId() {
return messageId;
}

@Field
public void setMessageId(String messageId) {
this.messageId = messageId;
}
public String getTitle() {
return title;
}

@Field("msg_title")
public void setTitle(String title) {
this.title = title;
}
public String[] getContent() {
return content;
}

@Field("msg_content")
public void setContent(String[] content) {
this.content = content;
}
}


增删改查demo
package org.itat.lucene.solr.test;

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CloudSolrServer;
import org.apache.solr.client.solrj.impl.ConcurrentUpdateSolrServer;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Before;
import org.junit.Test;

public class SolrTest {
private final static String URL = "http://localhost:8080/solr/mail";
private HttpSolrServer server = null;

@Before
public void init() {
server = new HttpSolrServer(URL);
}

@Test
public void addOneOrDelete() {

/*HttpSolrServer server=new HttpSolrServer(URL);*/
/*ConcurrentUpdateSolrServer cs=new ConcurrentUpdateSolrServer(URL,1,1);
*新版已被ConcurrentUpdateSolrClient取代
* */
/*CloudSolrServer css=new CloudSolrServer("192.168.0.1");//zookeeper地址
*已被CloudSolrClient
*/

HttpSolrClient server= new HttpSolrClient(URL);//新版已经取代了HttpSolrServer

SolrInputDocument doc = new SolrInputDocument();
//id是唯一的主键,当多次添加的时候,最后添加的相同id的域会覆盖前面的域
doc.addField("messageId","3");
doc.addField("msg_title", "这是我的第一个solrj的程序");
doc.addField("msg_content","我的solrj的程序究竟能不能跑得起来呢?");
try {
UpdateResponse ur=server.add(doc);
System.out.println(ur);

/*server.deleteByQuery("*:*");*/
server.commit(null,true,true,false);
server.close();
} catch (SolrServerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

//一下添加多个
@Test
public void addList() {
try {
List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
SolrInputDocument doc = new SolrInputDocument();
doc.addField("messageId", "2");
doc.addField("msg_title", "很好!solr可以工作了");
doc.addField("msg_content","slor总算可以正式工作了");
docs.add(doc);
doc = new SolrInputDocument();
doc.addField("messageId", "3");
doc.addField("msg_title", "测试一下solr的添加");
doc.addField("msg_content","看看能不能添加一个列表信息");
docs.add(doc);
server.add(docs);
server.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

//基于java bean的添加
@Test
public void addBean() {
try {
List<Message> msgs = new ArrayList<Message>();
msgs.add(new Message("4","基于java bean的添加",
new String[]{"通过java bean完成添加","java bean的添加附件"}));
msgs.add(new Message("5","基于java bean的列表数据的添加",
new String[]{"测试如何通过一个对象完成添加","通过对象完成添加的附件"}));
server.addBeans(msgs);
server.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

//查询
@Test
public void test04() {
try {
//定义查询字符串
SolrQuery query = new SolrQuery("*");
query.setStart(0);
query.setRows(5);
QueryResponse resp=null;
try {
resp = server.query(query);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//查询出来的结果都保存在SolrDocumentList中
SolrDocumentList sdl = resp.getResults();
System.out.println(sdl.getNumFound());
for(SolrDocument sd:sdl) {
//                System.out.println(sd);
System.out.println(sd.getFieldValue("msg_title")+","+sd.getFieldValue("msg_content"));
}
} catch (SolrServerException e) {
e.printStackTrace();
}
}

//基于javabean查询
@Test
public void test05() {
try {
SolrQuery query = new SolrQuery("*");
query.setStart(0);
query.setRows(5);
QueryResponse resp=null;
try {
resp = server.query(query);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//可以直接查询相应的bean对象,但是不是很常用,无法得到查询总条数
List<Message> list = resp.getBeans(Message.class);
System.out.println(list.size());
for(Message msg:list) {
System.out.println(msg.getTitle());
}
} catch (SolrServerException e) {
e.printStackTrace();
}
}

//高亮
@Test
public void test06() {
try {
SolrQuery query = new SolrQuery("msg_content:测试 OR msg_title:测试");
query.setHighlight(true).setHighlightSimplePre("<span class='highligter'>")
.setHighlightSimplePost("</span>")
.setStart(0).setRows(5);
query.setParam("hl.fl", "msg_title,msg_content");
QueryResponse resp=null;
try {
resp = server.query(query);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//查询出来的结果都保存在SolrDocumentList中
SolrDocumentList sdl = resp.getResults();
System.out.println(sdl.getNumFound());
for(SolrDocument sd:sdl) {
String id = (String)sd.getFieldValue("messageId");
System.out.println(resp.getHighlighting().get(id).get("msg_content"));
//高亮结果以唯一索引为key
}
} catch (SolrServerException e) {
e.printStackTrace();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  中文 分词器