`
thrillerzw
  • 浏览: 139154 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

solr

 
阅读更多

一、简介

基于lucene

Solr 主要特性有:强大的全文检索功能,高亮显示检索结果,动态集群,数据库接口和电子文档(Word,PDF等)的处理。而且 Solr 具有高度的可扩展,支持分布搜索和索引的复制

solr wiki :  http://wiki.apache.org/solr/FrontPage

二、jetty简易启动

cd D:\sorl\solr-4.6.0\example

java -jar start.jar  

 

http://127.0.0.1:8983/solr

引用的是D:\sorl\solr-4.6.0\example\webapps\solr.war  如果要改war包比较麻烦,比如加入ik

三、solr+Tomcat部署

1、拷贝出E:\sorl\solr-4.5.1\example\solr 作为sorlhome, E:\sorl\solrhome(改名)

2、将E:\sorl\solr-4.5.1\dist\solr-4.5.1.war拷贝到Tomcat的webapp目录下,启动,解压后改名为solr

3、 配置solrhome为E:/sorl/solrhome

去掉 webapps->solr-> web.xml里env-entry的注释,

<env-entry>

<env-entry-name>solr/home</env-entry-name>

<env-entry-value>E:/sorl/solrhome</env-entry-value>

<env-entry-type>java.lang.String</env-entry-type>

</env-entry>

 

或者tomcat增加 E:\sorl\apache-tomcat-6.0.29\conf\Catalina\localhost\solr.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<Context  docBase="E:/solr/apache-tomcat-6.0.29/webapps/solr" debug="5" crossContext="true" >    
    <Environment name="solr/home" type="java.lang.String" value="E:/solr/solrhome" override="true" />    
</Context>

 或者在server.xml的host中配置context

 

4、启动,发现报错,Error filterstart ,因为 war包中没有配置日志。将solr目录下 example\lib\ext中的jar包“、example\resources中的log4j.properties   copy到tomcat的lib目录下。

 

5 、启动正常后,访问 http://localhost:8080/solr/ 进入主目录。

 

三、中文分词

参考我的    http://thrillerzw.iteye.com/blog/2049172

 

四、solr+eclipse调试环境搭建

1、下载solr-4.5.1-src.tgz,解压

2、ant添加ivy支持:运行ant ivy-bootstrap ,安装ivy后,C:\Users\Administrator\.ant\lib多出ivy-2.3.0.jar,拷贝到apache-ant-1.8.4\lib目录中。

3、cmd进入工程目录,ant eclipse编译为eclipse工程,

4、导入eclipse

5、在源码中新建一个WebContent文件夹,复制 solr-4.5.1-src\solr\webapp\web 下的内容至 WebContent;复制 solr-4.5.1-src \solr\example中的solr文件夹复制到 WebContent中,作为solr/home

6、eclipse marketplace搜索并安装jetty插件run-jetty-run

 

7、run Configurations,右击jetty webapp,新建,配置端口为80等,在Arguments面板中的VM arguments中增加 -Dsolr.solr.home=WebContent/solr

8、运行jetty,浏览器访问http://127.0.0.1/solrsrc

 

五、demo

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.FacetField;
import org.apache.solr.client.solrj.response.FacetField.Count;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.RangeFacet;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;

public class SolrDemo {
    	//索引
	public static void solrIndex(){
		try {
			String url = "http://localhost:8080/solr";
			HttpSolrServer server = new HttpSolrServer(url);
			SolrInputDocument doc = new SolrInputDocument();
			doc.addField("id", "1");
			doc.addField("name", "马航失联");
			doc.addField("age", 25);
			doc.addField("content", "家人好担心");
			doc.addField("testik", "希望马航顺利回来,家里人真的真的爱你,加油");
			
			SolrInputDocument doc2 = new SolrInputDocument();
			doc2.addField("id", "2");
			doc2.addField("name", "加油马航");
			doc2.addField("age", 30);
			doc2.addField("content", "必须加油2014");
			doc2.addField("testik", "马航加油,大家都在等你们回来");
			
			SolrInputDocument doc3 = new SolrInputDocument();
			doc3.addField("id", "3");
			doc3.addField("name", "软件很累");
			doc3.addField("age", 30);
			doc3.addField("content", "喜欢还好,一天一天");
			doc3.addField("testik", "测试ik,马航加油,thriller加油");
			server.add(doc);
			server.add(doc2);
			server.add(doc3);
			server.commit();
		} catch (SolrServerException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	//查询
	public static void solrSearcher(){
		try {
			String url = "http://localhost:8080/solr";
			HttpSolrServer server = new HttpSolrServer(url);
			/**
			 * 1、在程序中设定的搜索域优先级 > schema.xml文件中配置的默认搜索域
			 * 2、在搜索词前面加入搜索域的优先级 > solrconfig.xml中配置的qf值 > schema.xml文件中配置的默认搜索域
			 * 3、在程序中用setFields函数可以指定显示域,并且该指定方法的优先级 > solrconfing.xml中配置的fl值
			 */
			//AND OR 添加多个
			SolrQuery query = new SolrQuery("testik:加油"); 
			//默认搜索域
			//params.setParam("df", "name");
			
			//显示域
			String[] fields = {"id","name","content","testik","age"};
			query.setFields(fields);
			
			//高亮
			query.addHighlightField("testik");
			query.setHighlight(true);
			query.setHighlightSimplePre("<em class=\"highlight\" >");
			query.setHighlightSimplePost("</em>");
			//显示的字数
			query.setHighlightFragsize(4);
			//排序,可以添加多个。先加入的 优先级高
			query.addSort("age", ORDER.asc);
			query.addSort("id", ORDER.desc);
		
			
			//过滤:包含的留下  达到精确搜索   可添加多个
			String[] fqs = {"testik:加油"};
//			String[] fqs = {"testik:加油","name:加油马航"};
			query.addFilterQuery(fqs);
			
			//分页   起始位置   每页条数   todo:lucene、solr内存溢出问题
			query.setStart(0);
			query.setRows(10);
			
			//facet 
			//FacetField统计的域
			String[] ftf = {"name","age"};
			query.addFacetField(ftf);
			//RangeFacet统计,从1开始,到28结束,每隔10个统计一次。最后一次大于28的也会统计进去。
			query.addNumericRangeFacet("age", 1, 28, 10);
			
			QueryResponse response = server.query(query);
			
			 //"name","age" FacetField统计结果
			 List<FacetField> listField = response.getFacetFields();
			 for(FacetField facetField : listField){
				 System.out.println(facetField.getName());
				 List<Count> counts = facetField.getValues();
				 for(Count c : counts){
					 System.out.println(c.getName()+":"+c.getCount());
				 }
			 }
			//age RangeFacet统计结果
			 List<RangeFacet> listFacet = response.getFacetRanges();
			 for(RangeFacet rf : listFacet){
				 List<RangeFacet.Count> listCounts = rf.getCounts();
				 for(RangeFacet.Count count : listCounts){
					 System.out.println("RangeFacet:"+count.getValue()+":"+count.getCount());
				 }
			 }
			
			SolrDocumentList list = response.getResults();
			//第一个map key:document.getFieldValue("id")文档id值    第二个map key:高亮的域名 
			 Map<String,Map<String,List<String>>> map = response.getHighlighting();
			System.out.println("total hits:"+list.getNumFound());
			for(SolrDocument doc : list){
				System.out.println("id:"+doc.getFieldValue("id"));
				System.out.println("name:"+doc.getFieldValue("name"));
				System.out.println("content:"+doc.get("content"));
				System.out.println("age:"+doc.getFieldValue("age"));
				System.out.println("testik:"+doc.get("testik"));
				System.out.println("hl:"+map.get(doc.getFieldValue("id")).get("testik").get(0));
				//修改doc方法 document.setField(高亮域, 高亮的值);
				doc.setField("testik", map.get(doc.getFieldValue("id")).get("testik").get(0));
				System.out.println("hl testik:"+doc.get("testik"));
				System.out.println();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	//删除
	public static void solrDelIndex(){
		try {
			String url = "http://localhost:8080/solr";
			HttpSolrServer server = new HttpSolrServer(url);
			server.deleteById("1");
			server.commit();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

  5.2、

       索引前,准备数据,把action字段为delete的索引、数据库记录都删除,把action字段为update的索引删除,action字段改为add重新索引。

索引后,更新数据库flag字段,索引时间字段。

 

 六、配置文件

      schema.xml 

 

id类型:
//multiValued="true" 为多个域时候使用,跟复制域<copyField source="name" dest="name_content" /> 配合使用
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
<field name="pname" type="text_chinese" indexed="true"  stored="true" />

//sortMissingLast=”true”:没有该field的数据排在有该field的数据之后,而不管请求时的排序规则。
<fieldType name="string" class="solr.StrField" sortMissingLast="true" />
//动态域 以备扩展之用。在索引文档时,一个字段如果在常规字段中没有匹配时,将到动态字段中匹配。
<dynamicField name="*_i"  type="int"    indexed="true"  stored="true"/>
<dynamicField name="*_is" type="int"    indexed="true"  stored="true"  multiValued="true"/>

//中文分词,ik
   <fieldType name="text_chinese" class="solr.TextField" positionIncrementGap="100">

      <analyzer type="index">

        <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" dicPath="ext.dic"/>

        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />

        <!-- in this example, we will only use synonyms at query time

        <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>

        -->
        <filter class="solr.LowerCaseFilterFactory"/>

      </analyzer>

      <analyzer type="query">

        <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"/>

        <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>

      

一个analyzer chain中必须且只能包含一个tokenizer。tokenizer的作用是将输入的text stream (字符串,即field中存储的值)分解若干token。而filter的输入是token流,产出也是token流,因此多个filter可以组成一个filter chain。filter主要针对输入的token流进行处理,如做stem,去除stopwords等。solr本身已经提供了大量的tokenizer和filter,同时这种机制也让我们可以方便的进行定制。

solr中默认包含的analyzer,tokenizer,filter:  http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters

如果没有指定analyzer的type,则表明index与query阶段用的是同样的analyzer。

 

 

七、HttpSolrServer初始化

SysConsts.SOLR_SERVER = new HttpSolrServer(SysConsts.SOLR_URL);
SysConsts.SOLR_SERVER.setSoTimeout(SysConsts.SOLR_TIME_OUT); // socket read timeout
SysConsts.SOLR_SERVER.setConnectionTimeout(SysConsts.SOLR_TIME_OUT);
SysConsts.SOLR_SERVER.setDefaultMaxConnectionsPerHost(100);
SysConsts.SOLR_SERVER.setMaxTotalConnections(100);
SysConsts.SOLR_SERVER.setFollowRedirects(false); // defaults to
SysConsts.SOLR_SERVER.setAllowCompression(true);
SysConsts.SOLR_SERVER.setMaxRetries(2);

  

八、查询方法

闭区间 [],开区间 {}: TO必须大写

 

prodlineid:13100 and indexnumber:[1497 TO 1499}

 

八、异常

    org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException: Expected content type application/octet-stream  

  解决:链接地址 url写错了。

 

 

  • 大小: 116.8 KB
  • 大小: 68.2 KB
分享到:
评论

相关推荐

    solr.war包solr.war包solr.war包solr.war包solr.war包

    solr.warsolr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包...

    已编译版本solr-8.11.2.tgz

    Solr 8.11.2是8.x系列的最后一个版本,新版本已经是9.0版本了。 1,什么是solr? Solr是一个独立的企业级搜索应用服务器,他对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务提供一定格式...

    solr服务器_solr_

    solr

    ik-analyzer-solr-6.x.jar

    solr更新到6.x的版本了,ik-analyzer-5.x.jar又不好使了。 无意间从"随-忆"的博客中看到了如何去修改源代码,从而让分词器能够适应6.x的版本,亲自尝试了一下,果然可以,于是奉上了自己重新编译的jar包。 6.x的版本...

    Linux上Solr的启动方式

    使用Solr内置的Jetty服务器启动Solr (1)借助X Shell上传solr的安装包到/usr/local/目录下,使用 tar -zxvf命令进行解压.  (2)使用内置的Jetty来启动Solr服务器只需要在example目录下,执行start.jar程序即可,...

    solr5.4.0完整包

    Solr 依存于Lucene,因为Solr底层的核心技术是使用Lucene 来实现的,Solr和Lucene的本质区别有以下三点:搜索服务器,企业级和管理。Lucene本质上是搜索库,不是独立的应用程序,而Solr是。Lucene专注于搜索底层的...

    java进阶Solr从基础到实战

    在本套课程中,我们将全面的讲解Solr,从Solr基础到Solr高级,再到项目实战,基本上涵盖了Solr中所有的知识点。 主讲内容 章节一:Solr基础(上) 1. 环境搭建 2. 核心讲解 3. 数据导入 4. 各种中文分析器 章节二:...

    Solr in action.mobi

    PART 1 MEET SOLR. .................................................................1 1 ■ Introduction to Solr 3 2 ■ Getting to know Solr 26 3 ■ Key Solr concepts 48 4 ■ Configuring Solr 82 5 ■ ...

    Scaling Big Data with Hadoop and Solr

    Technologies like Hadoop are trying to address some of the concerns, while Solr provides high-speed faceted search. Bringing these two technologies together is helping organizations resolve the ...

    [Solr] Solr 管理教程 (英文版)

    [Packt Publishing] Solr 管理教程 (英文版) [Packt Publishing] Administrating Solr (E-Book) ☆ 图书概要:☆ Master the use of Drupal and associated scripts to administrate, monitor, and optimize Solr...

    solr增量更新架包apache-solr-dataimportscheduler.jar

    solr增量更新-

    SOLR的应用教程

    1.2 Solr的特性 4 1.2.1 Solr使用Lucene并且进行了扩展 4 1.2.2 Schema(模式) 5 1.2.3 查询 5 1.2.4 核心 5 1.2.5 缓存 5 1.2.6 复制 6 1.2.7 管理接口 6 1.3 Solr服务原理 6 1.3.1 索引 6 1.3.2 搜索 7 1.4 源码...

    solr基础知识介绍

    3. solr是什么 2 3.1 solr的功能 3 3.2 solr术语 3 3.2.1 Auto-warming 3 3.2.2 Facet 3 3.3.3 Document 6 3.3.4 Field 6 3.3.5 IndexWriter 6 3.3.6 IndexSearcher 6 3.3.7 Directory 6 3.3.8 Segment 7 3.3.9 ...

    Solr 搜索引擎 asp.net实现 示例详细操作步骤

    Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http G Solr et操作提出查找请求,并得到XML...

    全文检索solr7.5.0

    Solr 是Apache下的一个顶级开源项目,采用Java开发,基于Lucene的全文搜索服务器。Solr可以独立运行在Jetty、Tomcat等这些Servlet容器中。这里谈到了Lucene,它是一个开放源代码的全文检索引擎工具包。提供了完整的...

    solr4.7服务搭建

    如何使用solr搭建服务器

    支持solr5.5 solr6.0中IK分词需要的资料

    支持solr5.5 solr6.0中IK分词需要的资料

    solr/ext/ 里面的jar包

    org.apache.solr.common.SolrException: Could not find necessary SLF4j logging jars. If using Jetty, the SLF4j logging jars need to go in the jetty lib/ext directory. For other containers, the ...

    solr-dataimport-scheduler.jar 可使用于solr7.x版本

    solr定时索引使用到的定时调度器jar包, 可使用于solr7.x版本

Global site tag (gtag.js) - Google Analytics