电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

教你使用solr搭建你的全文检索


发布日期:2020/5/20
 

Solr 是一个可供企业使用的基于 Lucene 的开箱即用的搜索服务器对Lucene不熟?那么建议先看看下面两篇文档

实战Lucene 部分 初识 Lucenelolucene/

用Lucene加速Web搜索应用程序的开发lucene/

solr介绍

solr是基于Lucene Java搜索库的企业级全文搜索引擎目前是apache的一个项目它的官方网址在 solr需要运行在一个servlet 容器里例如tomcatsolr在lucene的上层提供了一个基于HTTP/XML的Web Services我们的应用需要通过这个服务与solr进行交互

solr安装和配置

关于solr的安装和配置这里也有两篇非常好的文档作者同时也是 Lucene Java 项目的提交人和发言人

使用Apache Solr实现更加灵巧的搜索solr/l

solr/l

下面主要说说需要注意的地方

Solr的安装非常简单下载solr的zip包后解压缩将dist目录下的war文件改名为solrwar直接复制到tomcat的webapps目录即可注意一定要设置solr的主位置有三种方法我采用的是在tomcat里配置javacomp/env/solr/home的一个JNDI指向solr的主目录(example目录下)建立/tomcat/conf/Catalina/localhost/solrxml文件

<Context docBase=D:/solrwar debug= crossContext=true >

<Environment name=solr/home type=javalangString

value=D:/solr/solr override=true />

</Context>

观察这个指定的solr主位置里面存在两个文件夹conf和data其中conf里存放了对solr而言最为重要的两个配置文件schemaxml和solrconfigxmldata则用于存放索引文件

schemaxml主要包括typesfields和其他的一些缺省设置

solrconfigxml用来配置Solr的一些系统属性例如与索引和查询处理有关的一些常见的配置选项以及缓存扩展等等

上面的文档对这两个文件有比较详细的说明非常容易上手注意到schemaxml里有一个

<uniqueKey>url</uniqueKey>

的配置这里将url字段作为索引文档的唯一标识符非常重要

加入中文分词

对全文检索而言中文分词非常的重要这里采用了qieqie庖丁分词(非常不错))集成非常的容易我下载的是alpha版本其中它支持最多切分和按最大切分创建自己的一个中文TokenizerFactory继承自solr的BaseTokenizerFactory

/** * Created by IntelliJ IDEA * User: ronghao * Date: * Time: :: * 中文切词 对庖丁切词的封装 */public class ChineseTokenizerFactory extends BaseTokenizerFactory { /** * 最多切分 默认模式 */ public static final String MOST_WORDS_MODE = mostwords; /** * 按最大切分 */ public static final String MAX_WORD_LENGTH_MODE = maxwordlength; private String mode = null; public void setMode(String mode) { if (mode==null||MOST_WORDS_MODEequalsIgnoreCase(mode) || defaultequalsIgnoreCase(mode)) { thismode=MOST_WORDS_MODE; } else if (MAX_WORD_LENGTH_MODEequalsIgnoreCase(mode)) { thismode=MAX_WORD_LENGTH_MODE; } else { throw new IllegalArgumentException(不合法的分析器Mode

参数设置: + mode); } } @Override public void init(Map args) { superinit(args); setMode(argsget(mode)); } public TokenStream create(Reader input) { return new PaodingTokenizer(input PaodingMakermake() createTokenCollector()); } private TokenCollector createTokenCollector() { if( MOST_WORDS_MODEequals(mode)) return new MostWordsTokenCollector(); if( MAX_WORD_LENGTH_MODEequals(mode)) return new MaxWordLengthTokenCollector(); throw new Error(never happened); } }

在schemaxml的字段text配置里加入该分词器

<fieldtype name=text class=solrTextField positionIncrementGap=>

<analyzer type=index>

<tokenizer class=comronghaofulltextsearchanalyzer

ChineseTokenizerFactory mode=mostwords/>

<filter class=solrStopFilterFactory ignoreCase=true

words=stopwordstxt/>

<filter class=solrWordDelimiterFilterFactory generateWordParts=

generateNumberParts= catenateWords= catenateNumbers=

catenateAll=/>

<filter class=solrLowerCaseFilterFactory/>

<filter class=solrRemoveDuplicatesTokenFilterFactory/>

</analyzer>

<analyzer type=query>

<tokenizer class=comronghaofulltextsearchanalyzer

ChineseTokenizerFactory mode=mostwords/>

<filter class=solrSynonymFilterFactory synonyms=synonymstxt

ignoreCase=true expand=true/>

<filter class=solrStopFilterFactory ignoreCase=true words=

stopwordstxt/>

<filter class=solrWordDelimiterFilterFactory generateWordParts=

generateNumberParts= catenateWords= catenateNumbers=

catenateAll=/>

<filter class=solrLowerCaseFilterFactory/>

<filter class=solrRemoveDuplicatesTokenFilterFactory/>

</analyzer>

</fieldtype>

完成后重启tomcat即可在

体验到庖丁的中文分词注意要将paodinganalysisjar复制到solr的lib下注意修改jar包里字典的home

与自己应用进行集成

Solr安装完毕现在可以将自己的应用与solr集成其实过程非常的简单应用增加数据——>根据配置的字段构建add的xml文档——>post至solr/update

应用删除数据à根据配置的索引文档唯一标识符构建delete的xml文档——>post至solr/update

检索数据à构建查询xml—>get至/solr/select/——>对solr返回的xml进行处理——>页面展现

具体的xml格式可以在solr网站找到另外就是solr支持高亮显示非常方便

关于中文solr内核支持UTF编码所以在tomcat里的serverxml需要进行配置

<Connector port= maxHttpHeaderSize= URIEncoding=UTF …/>

另外向solr Post请求的时候需要转为utf编码对solr 返回的查询结果也需要进行一次utf的转码检索数据时对查询的关键字也需要转码然后用+连接

String[] array = StringUtilssplit(query null ); for (String str : array) { result = result + URLEncoderencode(str UTF) + +; }

上一篇:类的设计方法

下一篇:applet 的参数化 -- 对数组进行初始化