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

一、配置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();
        }
    }
}

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

时间: 2024-10-08 05:42:00

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

1、solr包结构介绍,solrCore的安装配置,solr部署到Tomcat,多solrCore配置,配置中文分词器,界面功能介绍,Schema.xml的基本使用,数据导入

一.下载solr,下载地址是:http://archive.apache.org/dist/lucene/solr/,选择自己想要的solr的版本,本项目使用的版本是4.10.3 二.如果想下载Lucene,下载地址是: https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/java/ 三.其中solr-4.10.3的包结构如下: bin solr的脚本 contrib solr为了增强自身的功能,所添加的扩展依赖包 dist Solr  buil

Laravel查询构建器对数据库增删改查的例子

获取查询构建器很简单,还是要依赖DB门面,我们使用DB门面的table方法,传入表名,即可获取该表的查询构建器: $users = DB::table('users'); 这样我们就获取到了$users表的查询构建器,实际上,底层返回的是Illuminate\Database\Query\Builder的实例,我们对查询构建器的所有操作都是调用该实例对应类上的方法.下面我们就列举查询构建器的一些常用方法,我们还是沿用上一节创建的$users表做演示说明 . 1.新增数据 使用查询构建器的inse

solr 实现 中文分词,IK Analyzer

solr默认是不支持中文分词的,这样就需要我们手工配置中文分词器,在这里我们选用IK Analyzer中文分词器. IK Analyzer下载地址:https://code.google.com/p/ik-analyzer/downloads/list 如图:     默认大家已经下载并解压了solr,在这里我们使用solr 4.10.4版本 试验环境centos 6.5 ,JDK1.7 整合步骤 1:解压下载的IK Analyzer_2012_FF_hf1.zip压缩包,把IKAnalyzer

Lucene 3.6.2入门(4) 中文分词器

package com.jadyer.lucene; import java.io.IOException; import java.io.StringReader; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.SimpleAnalyzer; import org.apache.lucene.analysis.StopAnalyzer; import org.apache.lucene

11大Java开源中文分词器的使用方法和分词效果对比

本文的目标有两个: 1.学会使用11大Java开源中文分词器 2.对比分析11大Java开源中文分词器的分词效果 本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那要用的人结合自己的应用场景自己来判断. 11大Java开源中文分词器,不同的分词器有不同的用法,定义的接口也不一样,我们先定义一个统一的接口: 从上面的定义我们知道,在Java中,同样的方法名称和参数,但是返回值不同,这种情况不可以使用重载. 这两个方法的区别在于返回值,每一个分词器都可能有多种分词

如何在Elasticsearch中安装中文分词器(IK+pinyin)

如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题--中文词语被分成了一个一个的汉字,当用Kibana作图的时候,按照term来分组,结果一个汉字被分成了一组. 这是因为使用了Elasticsearch中默认的标准分词器,这个分词器在处理中文的时候会把中文单词切分成一个一个的汉字,因此引入中文的分词器就能解决这个问题. 本篇文章按照下面的内容进行描述: 分词器的作用 安装IK 简单的测试 模拟测试 安装elasticsearch-analysis-piny

mybatis 一对多配置关系实现在一个映射文件中进行增删改查?

问题描述 mybatis 一对多配置关系实现在一个映射文件中进行增删改查? 一对多关系表,如何在一个映射文件中实现对两个表的增删改查操作? 解决方案 http://wenku.baidu.com/link?url=Pxf2M0_Xb42weBxGfesIrn2_nCLTCEQZr1ZuOxvq5-nu_w1rBkgltw7Qlz-iBnv7lDfGf8h_J7i9plUEzaQfpI5JviC0NsTnyV95fdyUwvu 解决方案二: 你在xml定义两个表的sql匹配就行.增删改查就对这两个

mybatis generator 配置 反向生成Entity简单增删改查(推荐)_java

mybatis generator 配置 反向生成Entity简单增删改查实例代码如下所示: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd

java连接mysql数据库配置及增删改查操作记录

一.软件下载 直接到MySQL官网下载以下两个工具:mysql-5.1.32-win32.msi.mysql-gui-tools-5.0-r17-win32.msi 前者是MySQL的安装文件,后者是MySQL Tool安装文件,包括JDBC. 二.环境配置 把mysql-connector-java-5.0.4-bin.jar从MySQL\MySQL Tools for 5.0\java\lib拷贝到D:\Tomcat 6.0\lib下,然后在classpath里面加入D:\Tomcat 6.