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

原创 2016年08月28日 14:10:29


一、配置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包

wKioL1buVxjgfcciAAAXde9_L7Q195.png


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



本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1753167

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

给solr配置中文分词器

目录 Solr的中文分词器 1 1. smartcn 分词器的安装 1 2. IK 分词器的安装 2 3.中文分词器mmseg4j 3Solr的中文分词器 中文分词在solr里面...

lucene使用IKAnalyzer报错:java.lang.AbstractMethodError

自己使用的IK分词器是 上的,该网站只提供一个版本。maven配置 如下 org.apache.lucene lucene-core 3.6.2 com.janeluo ika...

solr下配置IKAnalyzer分词器的扩展词典,停止词词典

1:将IKAnalyzer_home文件夹下的stopword.dic和IKAnalyzer.cfg.xml复制到tomcat_home/webapps/solr/WEB-INF/classes下,并...

你不知道的全文检索---solr安装中文分词器及配置业务字段

在solr中默认的使用的是英文分词,所以需要手工配置中文分词器,需要我们配置一个FieldType,在FieldType中指定中文分词器。

solr4.7中文分词器(ik-analyzer)配置

solr本身对中文分词的处理不是太好,所以中文应用很多时候都需要额外加一个中文分词器对中文进行分词处理,ik-analyzer就是其中一个不错的中文分词器。 solr版本:4.7.0 需要ik-a...

使用Solrj 获取语句分词结果的代码

import java.util.ArrayList; import java.util.Iterator; import java.util.List;import org.apache.log4j...

solrj分词Java使用

小狼最近在看solr分词,环境是搭好了,但是小狼想把这个算出来的分词放到Java端,很纠结

中文分词之Java实现使用IK Analyzer实现

IK Analyzer是基于lucene实现的分词开源框架,下载路径:http://code.google.com/p/ik-analyzer/downloads/list需要在项目中引入:IKAna...

solr 的分析器,分词器和分词过滤器

【本文基于对此英文网页的理解http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters】    概览     当对一个文档(doc...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)