solr3.6.2 使用配置

本文介绍如何在Windows环境下部署Solr 3.6.2及Apache Tomcat 6.0.37,并实现中文分词器IKAnalyzer的集成,最后通过Java示例展示了Solr的基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境:

  1. windows
  2. solr3.6.2下载:http://www.apache.org/dyn/closer.cgi/lucene/solr/3.6.2
  3. apache-tomcat-6.0.37下载:http://tomcat.apache.org/download-60.cgi#6.0.37
  4. ikanalyzer中文分词器下载:https://code.google.com/p/ik-analyzer/downloads/detail?name=IKAnalyzer3.2.8%20bin.zip
  5. luke3.5.0下载(可选):https://code.google.com/p/luke/downloads/detail?name=lukeall-3.5.0.jar
一、下载上述文件

二、tomcat发布solr配置
  1. 进入apache-tomcat-6.0.37\conf\Catalina\localhost 目录,新建 solr.xml ,内容如下:
    <?xml version="1.0" encoding="utf-8"?>
    <Context docBase="D:\apache-tomcat-6.0.37\webapps\solr" reloadable="true" >    
    	<Environment name="solr/home" type="java.lang.String" value="D:\apache-tomcat-6.0.37\webapps\solr\solr" override="true" />    
    </Context>
  2. 将下载的apache-solr-3.6.2.zip 解压,进入apache-solr-3.6.2\dist 目录,将里面的apache-solr-3.6.2.war 复制到apache-tomcat-6.0.37\webapps 目录下面,并重命名为solr.war
  3. 启动tomcat,系统会自动将 solr.war 进行解压,你会发现在 webapps 目录下面多了一个 solr的文件夹,然后停止tomcat服务,删除solr.war
  4. 进入apache-solr-3.6.2\example 目录,将里面的solr文件夹复制到 apache-tomcat-6.0.37\webapps\solr 目录下,最后的完整目录应该是这样 apache-tomcat-6.0.37\webapps\solr\solr  
  5. 修改 apache-tomcat-6.0.37\conf 目录下 server.xml 的编码,增加 URIEncoding="UTF-8"
    <Connector port="8080" protocol="HTTP/1.1" 
                   connectionTimeout="20000" 
                   redirectPort="8443" URIEncoding="UTF-8" />
  6. 启动tomcat,访问 http://localhost:8080/solr/admin/ 即可进入solr管理页面
三、增加ikanalyzer中文分词器
  1. 解压 IKAnalyzer3.2.8 bin.zip,将里面的 IKAnalyzer3.2.8.jar 放入到 apache-tomcat-6.0.37\webapps\solr\WEB-INF\lib 目录下;
  2. 进入apache-tomcat-6.0.37\webapps\solr\solr\conf 目录,在 schema.xml 中增加如下内容:
	<!-- IKAnalyzer 中文分词-->
	<fieldType name="text_ik" class="solr.TextField">
		<analyzer type="index" positionIncrementGap="100" autoGeneratePhraseQueries="true">
			<tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false"/>
			<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
			<filter class="solr.LowerCaseFilterFactory"/>
		</analyzer>
		<analyzer type="query">
			<tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="true" />
			<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
			<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
			<filter class="solr.LowerCaseFilterFactory"/>
		</analyzer>
	</fieldType>

四、solr使用配置
  • 以下测试的Document中增加了2个新的Field(desc和address),需要在 apache-tomcat-6.0.37\webapps\solr\solr\conf 目录下的schema.xml中增加如下内容:
   <field name="desc" type="text_ik" indexed="true" stored="true" /> 
   <field name="address" type="text_ik" indexed="true" stored="true" multiValued="true" />
   <!-- 设置查询的default value,方便查询时无需输入*:条件 -->
   <field name="all_info" type="text_ik" indexed="true" stored="false" multiValued="true" />
   <copyField source="name" dest="all_info" />
   <copyField source="desc" dest="all_info" />
   <copyField source="address" dest="all_info" />
  • 修改apache-tomcat-6.0.37\webapps\solr\solr\conf 目录下的 solrconfig.xml 文件,修改查询的default value,将“df”修改为前面定义的"all_info":
  <requestHandler name="/select" class="solr.SearchHandler">
    <!-- default values for query parameters can be specified, these
         will be overridden by parameters in the request
      -->
     <lst name="defaults">
       <str name="echoParams">explicit</str>
       <int name="rows">10</int>
       <str name="df">all_info</str>
     </lst>
五、Java示例
执行如下代码需要的jar包的maven配置如下:
  <dependency>
	  <groupId>commons-logging</groupId>
	  <artifactId>commons-logging</artifactId>
	  <version>1.1.3</version>
	</dependency>

	<dependency>
	  <groupId>org.apache.solr</groupId>
	  <artifactId>solr-solrj</artifactId>
	  <version>3.6.2</version>
	</dependency>

	<dependency>
		<groupId>org.apache.httpcomponents</groupId>
		<artifactId>httpclient</artifactId>
		<version>4.1.3</version>
	</dependency>

	<dependency>
		<groupId>org.apache.httpcomponents</groupId>
		<artifactId>httpclient-cache</artifactId>
		<version>4.1.3</version>
	</dependency>

	<dependency>
		<groupId>org.apache.httpcomponents</groupId>
		<artifactId>httpcore</artifactId>
		<version>4.1.3</version>
	</dependency>

	<dependency>
		<groupId>org.apache.httpcomponents</groupId>
		<artifactId>httpmime</artifactId>
		<version>4.1.3</version>
	</dependency>

  • SolrTest.java
package com.solr;

import java.util.ArrayList;
import java.util.Collection;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
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.apache.solr.common.params.SolrParams;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.beans.Index;

public class SolrTest {

	private SolrServer server;

	private static final String DEFAULT_URL = "http://localhost:8080/solr/";

	@Before
	public void init() {
		try {
			server = new HttpSolrServer(DEFAULT_URL);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@After
	public void destory() {
		server = null;
	}

	public final void print(Object o) {
		System.out.println(o);
	}

	@Test
	/**
	 * 验证服务是否正常
	 */
	public void server() {
		print(server);
	}

	@Test
	/**
	 * 查询
	 */
	public void query() {
		String query = "华星路";

		SolrParams params = new SolrQuery(query);
		try {
			QueryResponse response = server.query(params);

			SolrDocumentList list = response.getResults();
			for (SolrDocument sd : list) {
				print(sd);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Test
	public void queryCase() {
		SolrQuery params = new SolrQuery();
		params.setQuery("华星路");

		// 设置高亮
		params.setHighlight(true);
		params.addHighlightField("address");
		params.setHighlightSimplePre("<font color='red'>");
		params.setHighlightSimplePost("</font>");
		params.setHighlightFragsize(2000);

		try {
			QueryResponse response = server.query(params);
			SolrDocumentList list = response.getResults();
			for (SolrDocument sd : list) {
				String id = (String) sd.getFieldValue("id");
				if (response.getHighlighting().get(id) != null) {
					print(response.getHighlighting().get(id).get("address"));
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Test
	/**
	 * 添加Document
	 */
	public void addDoc() {
		SolrInputDocument doc = new SolrInputDocument();
		doc.addField("id", 1);
		doc.addField("name", "张三");
		doc.addField("desc", "我就是张三的张,张三的三");
		doc.addField("address", new String[] { "浙江杭州市西湖区华星路99号创业大厦1楼",
				"上海市长宁区天山西路123号" });

		try {
			UpdateResponse response = server.add(doc);
			server.commit();
			print(response);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 批量添加Document
	 */
	@Test
	public void addDocs() {
		Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();

		SolrInputDocument doc1 = new SolrInputDocument();
		doc1.addField("id", 2);
		doc1.addField("name", "李四");
		doc1.addField("desc", "我就是李四的李,李四的四");
		doc1.addField("address", new String[] { "浙江杭州市西湖区华星路86号",
				"云南省大理市ABC路81号" });
		docs.add(doc1);

		SolrInputDocument doc2 = new SolrInputDocument();
		doc2.addField("id", 3);
		doc2.addField("name", "王五");
		doc2.addField("desc", "我就是王五的王,王五的五");
		doc2.addField("address",
				new String[] { "浙江宁波市华星路16号", "新疆省乌鲁木齐市XX路64号" });
		docs.add(doc2);

		try {
			UpdateResponse response = server.add(docs);
			server.commit();
			print(response);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 删除所有Document
	 */
	@Test
	public void deleteAllDoc() {
		try {
			UpdateResponse response = server.deleteByQuery("*:*");
			server.commit();
			print(response);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 根据ID删除Document
	 */
	@Test
	public void deleteById() {
		try {
			UpdateResponse response = server.deleteById("1");
			server.commit();
			print(response);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 添加JavaEntity Bean
	 */
	@Test
	public void addBean() {
		Index index = new Index();
		index.setId("4");
		index.setName("赵六");
		index.setDesc("赵国的小六子");
		index.setAddress(new String[] { "杭州市西湖区", "杭州市上城区", "杭州市下城区" });

		try {
			UpdateResponse response = server.addBean(index);
			server.commit();
			print(response);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
  • Index.java
package com.beans;

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

public class Index {

	@Field
	private String id;
	@Field
	private String name;
	@Field
	private String desc;
	@Field
	private String[] address;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getDesc() {
		return desc;
	}

	public void setDesc(String desc) {
		this.desc = desc;
	}

	public String[] getAddress() {
		return address;
	}

	public void setAddress(String[] address) {
		this.address = address;
	}
}

六、luke使用
  1. 进入lukeall-3.5.0.jar的目录,执行【java -jar lukeall-3.5.0.jar】命令
  2. 打开solr 的索引文件所在目录 apache-tomcat-6.0.37\webapps\solr\solr\data\index,即可查看索引的详细情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值