Solr的配置及从数据库建立索引


1 Solr 简介

    Solr 是一个基于 Lucene 的 Java 搜索引擎服务器。 Solr 提供了层面搜索、命中醒目显示并且支持多种输出格式(包括 XML/XSLT 和 JSON 格式)。它易于安装和配置,而且附带了一个基于 HTTP 的管理界面。 Solr 已经在众多大型的网站中使用,较为成熟和稳定。 Solr 包装并扩展了 Lucene ,所以 Solr 的基本上沿用了 Lucene 的相关术语。更重要的是, Solr 创建的索引与 Lucene 搜索引擎库完全兼容。通过对 Solr 进行适当的配置,某些情况下可能需要进行编码, Solr 可以阅读和使用构建到其他 Lucene 应用程序中的索引。此外,很多 Lucene 工具(如 Nutch 、 Luke )也可以使用 Solr 创建的索引。

2 、Ubuntu Solr 安装配置

    由于 Solr 基于 java 开发,因此 Solr 在 windows 及 Linux 都能较好部署使用,但由于 Solr 提供了一些用于测试及管理、维护较为方便的 shell 脚本,因此在生产部署时候建议安装在 Linux 上,测试时候可以在 windows 使用。

下面以 Ubuntu 下安装配置 Solr 进行说明。

首先下载Tomcat的压缩包。

unzip apache-tomcat-6.0.16.zip

mv apache-tomcat-6.0.16 /opt/tomcat

chmod 755 /opt/tomcat/bin/*


下载apache-solr-1.4.0压缩包。tar -xvf apache-solr-1.2.0.tgz

Solr 的安装配置最为麻烦的是对 solr.solr.home 的理解和配置,主要有三种

  • 基于当前路径的方式

cp apache-solr-1.4.0/dist/apache-solr-1.4.0.war /opt/tomcat/webapps/solr.war

mkdir /opt/solr-tomcat

cp -r apache-solr-1.2.0/example/solr/ /opt/solr-tomcat/

cd /opt/solr-tomcat

/opt/tomcat/bin/startup.sh

由于在此种情况下(没有设定 solr.solr.home 环境变量或 JNDI 的情况下), Solr 查找 ./solr ,因此在启动时候需要切换到 /opt/solr-tomcat

  • 基于环境变量 solr.solr.home

在当前用户的环境变量中( .bash_profile )或在 /opt/tomcat/catalina.sh 中添加如下环境变量

export JAVA_OPTS="$JAVA_OPTS -Dsolr.solr.home=/opt/solr-tomcat/solr"

  • 基于 JNDI 配置

mkdir –p /opt/tomcat/conf/Catalina/localhost

touch /opt/tomcat/conf/Catalina/localhost/solr.xml ,内容如下 :

      <Context docBase="/opt/tomcat/webapps/solr" debug="0" crossContext="true" >

                 <Environment name="solr/home" type="java.lang.String" value="/opt/solr-tomcat/solr" override="true" />

    </Context>

访问 solr 管理界面 http://127.0.0.1:8080/solr

3 、用solr从数据库建立中文索引

1.在Ubuntu下安装mysql服务端和客户端。

#apt-get install mysql-server-5.0

#apt-get install mysql

2.添加Handler
    编辑/opt/solr-tomcat/solr/conf文件夹下的solrconfig.xml文件,在config元素中添加

3.  在此文件夹中新建一个data-config.xml文件,内容如下

4.  修改schema.xml,找到<fieldType name="text",将分词器修改为中文分词器,这里用的是包装过的Paoding分词,这个东西好像已经不更新了,以后看看IKAnalyzer吧。

原来的schema.xml中没有的字段自己添加上。schema.xml默认是UTF-8编码。首先在<fields></fields>里添加要索引的域。

注意:数据库的表的主键的名字最好是id,以后才好办。

然后在<solrQueryParser defaultOperator="OR"/>下面添加下面行。

5.  包装Paoding的分词器


这两个修改的类就放在/opt/tomcat/webapps/solr中,在压缩包的WEB-INF文件夹中新建classes文件夹,将这两个类连同包层次复制进去就行。

6.设置PAODING_DIC_HOME的环境变量,指向Paoding词典文件的位置。(比如/opt/dic)

#vim /etc/profile

添加下面的环境变量

JAVA_HOME=/usr/lib/jvm/java-6-openjdk
CLASSPATH=.:/usr/lib/jvm/java-6-openjdk/lib
ANT_HOME=/usr/share/ant
PATH="$JAVA_HOME/lib:$ANT_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
PAODING_DIC_HOME=/opt/dic
export JAVA_HOME
export CLASSPATH
export ANT_HOME
export PATH
export PAODING_DIC_HOME

7. 将Paoding和数据库驱动放到/opt/tomcat/webapps/solr/WEB-INF/lib中。

进入浏览器,运行
    http://localhost:8983/solr/dataimport?command=full-import
    导入成功后,运行
    http://localhost:8983/solr/admin/
    在搜索框中输入搜索内容进行查询

现在就完成了数据库的索引了。

 

<think>好的,我现在需要处理用户的问题,他想了解Java SE中的集合框架使用指南。首先,我得回忆一下用户之前提供的引用内容,引用[1]里提到了HashSet、LinkedHashSetTreeSet区别,以及它们的存储顺序。引用[2]则涉及Iterator接口Map的部分信息。用户现在需要的是一个使用指南,所以应该涵盖集合框架的主要接口实现类,以及如何选择使用它们。 首先,我应该从集合框架的整体结构入手,分清楚层次结构。Java集合框架主要分为CollectionMap两个根接口,Collection下又有ListSet、Queue等子接口,而Map是独立的。需要详细说明每个接口的特点常用实现类。 接下来,对于每个接口,比如List,要比较ArrayListLinkedListVector的区别,包括它们的线程安全、性能特点。Set部分已经引用了HashSet、LinkedHashSetTreeSet,可能需要再补充它们的应用场景使用注意事项。Map接口的话,HashMap、LinkedHashMap、TreeMap以及HashTableConcurrentHashMap区别也很重要,特别是线程安全排序特性。 然后,需要提到工具类CollectionsArrays,它们提供的排序、查找等方法,以及如何通过它们来操作集合。此外,迭代器IteratorListIterator的使用也是关键点,用户可能关心如何遍历集合以及并发修改异常的问题。 性能分析方面,要根据不同数据结构的底层实现,比如数组、链表、红黑树等,说明它们的增删改查时间复杂度,帮助用户选择合适的集合类。例如,ArrayList的随机访问快,但插入删除慢;LinkedList相反。 线程安全部分,需要明确哪些集合是线程安全的,比如Vector、HashTable,以及如何通过Collections工具类将非线程安全的集合转换为线程安全的。另外,Java 5之后引入的并发包中的类如ConcurrentHashMap也是重点。 最后,要给出选择集合的指南,根据是否需要有序、唯一性、线程安全等因素来推荐合适的实现类。可能还需要提醒使用泛型来保证类型安全,避免运行时错误。 现在需要检查是否有遗漏的部分,比如Queue接口,但用户提供的引用里没有提到,可能需要简要说明。另外,要确保回答结构清晰,分点列出,每个部分都有小标题,方便用户阅读。同时,按照用户的要求,行内公式用$...$,但可能数学公式不多,不过如果有排序算法之类的可以提及,比如快速排序的时间复杂度是$O(n \log n)$。 还要注意生成相关问题,根据用户之前的示例,可能的问题包括不同集合的选择、线程安全处理、性能比较、排序方法等。需要确保问题相关且有助于用户进一步学习。 现在开始组织内容,确保每个部分简明扼要,重点突出,避免过于冗长。同时引用用户提供的引用内容,比如在讲Set的时候引用[1],在讲Iterator的时候引用[2]。最后检查LaTeX格式是否正确,比如时间复杂度用$O(n)$这样的格式。</think>### Java SE 集合框架使用指南 Java集合框架是处理对象集合的核心工具库,包含接口、实现类及算法。以下是关键组成部分及使用建议: --- #### 一、核心接口与实现类 1. **Collection接口** - **List(有序可重复)** - `ArrayList`:基于动态数组,随机访问快($O(1)$),插入删除慢($O(n)$)[^1] - `LinkedList`:基于双向链表,插入删除快($O(1)$),随机访问慢($O(n)$) - `Vector`:线程安全的动态数组,性能较低(已逐渐被替代) - **Set(无序唯一)** - `HashSet`:基于哈希表,元素无序($O(1)$查询)[^1] - `LinkedHashSet`:维护插入顺序的哈希表(适合需要顺序的场景)[^1] - `TreeSet`:基于红黑树,元素按自然顺序或自定义顺序排列($O(\log n)$操作)[^1] - **Queue(队列)** - `LinkedList`:可作普通队列 - `PriorityQueue`:基于堆的优先级队列 2. **Map接口(键值对)** - `HashMap`:哈希表实现,键无序($O(1)$查询) - `LinkedHashMap`:维护插入顺序或访问顺序 - `TreeMap`:基于红黑树,按键排序 - `HashTable`:线程安全但性能低(建议用`ConcurrentHashMap`替代) --- #### 二、工具类与算法 - **`Collections`工具类** 提供排序、查找、同步化等方法: ```java List<Integer> list = new ArrayList<>(); Collections.sort(list); // 排序 Collections.synchronizedList(list); // 转换为线程安全集合 ``` - **`Arrays`工具类** 用于数组操作: ```java int[] arr = {3,1,4}; Arrays.sort(arr); // 数组排序 ``` - **迭代器`Iterator`** 遍历集合的标准方式,避免并发修改异常[^2]: ```java Iterator<String> it = list.iterator(); while(it.hasNext()) { System.out.println(it.next()); } ``` --- #### 三、性能与选择建议 1. **选择依据** - **是否需要唯一性** → 选择`Set`或`Map` - **是否需要顺序** → `List`或`LinkedHashSet`/`LinkedHashMap` - **是否需要排序** → `TreeSet`/`TreeMap` - **线程安全需求** → `ConcurrentHashMap`、`CopyOnWriteArrayList` 2. **时间复杂度对比** | 操作 | ArrayList | LinkedList | HashMap/TreeMap | |----------------|-----------|------------|-----------------| | 随机访问 | $O(1)$ | $O(n)$ | $O(1)$/$O(\log n)$ | | 插入/删除(中间)| $O(n)$ | $O(1)$ | - | --- #### 四、线程安全处理 - **同步包装器**:通过`Collections.synchronizedXXX()`转换非线程安全集合 - **并发集合**:优先使用`java.util.concurrent`包中的类(如`ConcurrentHashMap`) --- #### 、最佳实践 1. 使用泛型明确集合类型:`List<String> list = new ArrayList<>();` 2. 避免在遍历时修改集合(除非使用迭代器的`remove()`方法)[^2] 3. 需要频繁增删时优先选`LinkedList`,需要快速查询时选`ArrayList` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值