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

简介: 一、配置IKAnalyzer中文分词器Solr 版本5.2.1IKAnalyzer2012_u6.jar报错 ,用IKAnalyzer2012_FF_hf1.jar 替换可解决解决lucene4.0与IKAnalyzer的冲突。解决Exception in thread "main" java.lang.VerifyError: class org.wltea.analyzer.lu


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

目录
相关文章
|
1月前
|
存储 监控 安全
数据库多实例的部署与配置方法
【10月更文挑战第23天】数据库多实例的部署和配置需要综合考虑多个因素,包括硬件资源、软件设置、性能优化、安全保障等。通过合理的部署和配置,可以充分发挥多实例的优势,提高数据库系统的运行效率和可靠性。在实际操作中,要不断总结经验,根据实际情况进行调整和优化,以适应不断变化的业务需求。
|
20天前
|
数据库连接 Linux Shell
Linux下ODBC与 南大通用GBase 8s数据库的无缝连接配置指南
本文详细介绍在Linux系统下配置GBase 8s数据库ODBC的过程,涵盖环境变量设置、ODBC配置文件编辑及连接测试等步骤。首先配置数据库环境变量如GBASEDBTDIR、PATH等,接着修改odbcinst.ini和odbc.ini文件,指定驱动路径、数据库名称等信息,最后通过catalog.c工具或isql命令验证ODBC连接是否成功。
|
1月前
|
消息中间件 资源调度 关系型数据库
如何在Flink on YARN环境中配置Debezium CDC 3.0,以实现实时捕获数据库变更事件并将其传输到Flink进行处理
本文介绍了如何在Flink on YARN环境中配置Debezium CDC 3.0,以实现实时捕获数据库变更事件并将其传输到Flink进行处理。主要内容包括安装Debezium、配置Kafka Connect、创建Flink任务以及启动任务的具体步骤,为构建实时数据管道提供了详细指导。
69 9
|
1月前
|
安全 Nacos 数据库
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改。本文详细探讨了这一问题的原因及解决方案,包括限制公网访问、使用HTTPS、强化数据库安全、启用访问控制、监控和审计等步骤,帮助开发者确保服务的安全运行。
44 3
|
1月前
|
PHP 数据库 数据安全/隐私保护
布谷直播源码部署服务器关于数据库配置的详细说明
布谷直播系统源码搭建部署时数据库配置明细!
|
1月前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
51 2
|
1月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
129 2
|
8天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
72 15
|
2天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
9天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。