solr的总结

Solr调研总结开发类型 全文检索相关开发Solr版本 4.2文件内容 本文介绍solr的功能使用及相关注意事项;主要包括以下内容:环境搭建及调试;两个核心配置文件介绍;维护索引;查询索引,和在查询中可以应用的高亮显示、拼写检查、搜索建议、分组统计、拼音检索等功能的使用方法。版本 作者/修改人 日期V1.0 gzk 2013-06-041.Solr是什么?Solr它是一种开放源码的、基于LuceneJava的搜索服务器,易于加入到Web应用程序中。Solr提供了层面搜索(就是统计)、命中醒目显示并且支持多种输出格式(包括XML/XSLT和JSON等格式)。它易于安装和配置,而且附带了一个基于HTTP的管理界面。可以使用Solr的表现优异的基本搜索功能,也可以对它进行扩展从而满足企业的需要。Solr的特性包括:高级的全文搜索功能专为高通量的网络流量进行的优化基于开放接口(XML和HTTP)的标准综合的HTML管理界面可伸缩性-能够有效地复制到另外一个Solr搜索服务器使用XML配置达到灵活性和适配性可扩展的插件体系2.Lucene是什么?Lucene是一个基于Java的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene目前是ApacheJakarta(雅加达)家族中的一个开源项目。也是目前最为流行的基于Java开源全文检索工具包。目前已经有很多应用程序的搜索功能是基于Lucene,比如Eclipse帮助系统的搜索功能。Lucene能够为文本类型的数据建立索引,所以你只要把你要索引的数据格式转化的文本格式,Lucene就能对你的文档进行索引和搜索。3.SolrvsLuceneSolr与Lucene并不是竞争对立关系,恰恰相反Solr依存于Lucene,因为Solr底层的核心技术是使用Lucene来实现的,Solr和Lucene的本质区别有以下三点:搜索服务器,企业级和管理。Lucene本质上是搜索库,不是独立的应用程序,而Solr是。Lucene专注于搜索底层的建设,而Solr专注于企业应用。Lucene不负责支撑搜索服务所必须的管理,而Solr负责。所以说,一句话概括Solr:Solr是Lucene面向企业搜索应用的扩展。Solr与Lucene架构图:Solr使用Lucene并且扩展了它!一个真正的拥有动态字段(DynamicField)和唯一键(UniqueKey)的数据模式(DataSchema)对Lucene查询语言的强大扩展!支持对结果进行动态的分组和过滤高级的,可配置的文本分析高度可配置和可扩展的缓存机制性能优化支持通过XML进行外部配置拥有一个管理界面可监控的日志支持高速增量式更新(FastincrementalUpdates)和快照发布(SnapshotDistribution)4.搭建并调试Solr4.1安装虚拟机Solr必须运行在Java1.6或更高版本的Java虚拟机中,运行标准Solr服务只需要安装JRE即可,但如果需要扩展功能或编译源码则需要下载JDK来完成。可以通过下面的地址下载所需JDK或JRE:OpenJDK(http://java.sun.com/j2se/downloads.html)Sun(http://java.sun.com/j2se/downloads.html)IBM(http://www.ibm.com/developerworks/java/jdk/)Oracle(http://www.oracle.com/technology/products/jrockit/index.html)安装步骤请参考相应的帮助文档。4.2下载Solr本文针对Solr4.2版本进行调研的,下文介绍内容均针对Solr4.2版本,如与Solr最新版本有出入请以官方网站内容为准。Solr官方网站下载地址:http://lucene.apache.org/solr/4.3下载并设置ApacheAntSolr是使用Ant进行管理的源码,Ant是一种基于Java的build工具。理论上来说,它有些类似于Maven或者是C中的make。下载后解压出来后,进行环境变量设置。ANT_HOME:E:\Work\apache-ant\1.9.1(这里为你自己解压缩的目录)PATH:%ANT_HOME%\bin(这个设置是为了方便在dos环境下操作)查看是否安装成功,在命令行窗口中输入命令ant,若出现结果:说明ant安装成功!因为ant默认运行build.xml文件,这个文件需要我们建立。现在就可以进行buildSolr源码了。在命令行窗口中进入到你的Solr源码目录,输入ant会出现当前build.xml使用提示信息。其它的先不用管它,我们只要针对我们使用的IDE进行build就行了,如果使用eclipse就在命令行输入:anteclipse.如果使用IntelliJIDEA就在命令行输入:antidea。这样就能进行build了。黑窗口里提示这个。。。失败。。。为什么呢,最后我发现是因为下载的ant中少了一个jar就是这apache-ivy(下载地址:http://ant.apache.org/ivy/)这东东名子真怪ivy是ant管理jar依赖关系的。当第一次bulid时ivy会自动把build中的缺少的依赖进行下载。网速慢的第一次build要好久的。。。下载一个jar就行把jar放到ant的lib下(E:\Work\apache-ant\1.9.1\lib)这样再次运行ant就会成功了。到现在才可以进行Solr的代码调试。4.4配置并运行Solr代码不管用什么IDE首选都要设置SolrHome在IDE的JVM参数设置VMarguments写入-Dsolr.solr.home=solr/example/solr一般就行了.不行也可以使用绝对路径.solr使用StartSolrJetty文件作为入口文件进行调试代码,在这里可以设置服务器使用的端口和solr的webapps目录.一般都不用设置,默认的就可以进行调试.SolrHome也能可在代码中设置一样好用.System.setProperty("solr.solr.home","E:\\Work\\solr-4.2.0-src-idea\\solr\\example\\solr");目前是使用自带的一个example作为solr配置的根目录,如果你有其他的solr配置目录,设置之即可。点击run即可,debug也是一样可以用了。没有别的问题就应该能运行了.注意servlet容器使用的端口,如查提示:FAILEDSocketConnector@0.0.0.0:8983:java.net.BindException:Addressalreadyinuse:JVM_Bind就说明当前端口占用中.改一下就可以了.如果没有报错启动成功后就可以在浏览器中输入地址:http://localhost:8983/solr/就可以看到如下界面到这里Solr就成功配置并运行了.要是想跟代码调试在启动时在这个方法里点断点就可以Initializer的initialize()方法如果想从浏览器中找断点调试就要到SolrDispatchFilter的doFilter方法中点断点了.注:IE9在兼容模式下有bug,必须设置为非兼容模式。5.Solr基础因为Solr包装并扩展了Lucene,所以它们使用很多相同的术语。更重要的是,Solr创建的索引与Lucene搜索引擎库完全兼容。通过对Solr进行适当的配置,某些情况下可能需要进行编码,Solr可以阅读和使用构建到其他Lucene应用程序中的索引。在Solr和Lucene中,使用一个或多个Document来构建索引。Document包括一个或多个Field。Field包括名称、内容以及告诉Solr如何处理内容的元数据。例如,Field可以包含字符串、数字、布尔值或者日期,也可以包含你想添加的任何类型,只需用在solr的配置文件中进行相应的配置即可。Field可以使用大量的选项来描述,这些选项告诉Solr在索引和搜索期间如何处理内容。现在,查看一下表1中列出的重要属性的子集:属性名称 描述Indexed IndexedField可以进行搜索和排序。你还可以在indexedField上运行Solr分析过程,此过程可修改内容以改进或更改结果。Stored storedField内容保存在索引中。这对于检索和醒目显示内容很有用,但对于实际搜索则不是必需的。例如,很多应用程序存储指向内容位置的指针而不是存储实际的文件内容。5.1模式配置Schema.xmlschema.xml这个配置文件可以在你下载solr包的安装解压目录的\solr\example\solr\collection1\conf中找到,它就是solr模式关联的文件。打开这个配置文件,你会发现有详细的注释。模式组织主要分为三个重要配置5.1.1.types部分是一些常见的可重用定义,定义了Solr(和Lucene)如何处理Field。也就是添加到索引中的xml文件属性中的类型,如int、text、date等.参数说明:属性 描述name 标识而已class 和其他属性决定了这个fieldType的实际行为。sortMissingLast 设置成true没有该field的数据排在有该field的数据之后,而不管请求时的排序规则,默认是设置成false。sortMissingFirst 跟上面倒过来呗。默认是设置成falseanalyzer 字段类型指定的分词器type 当前分词用用于的操作.index代表生成索引时使用的分词器query代码在查询时使用的分词器tokenizer 分词器类filter 分词后应用的过滤器过滤器调用顺序和配置相同.5.1.2.fileds是你添加到索引文件中出现的属性名称,而声明类型就需要用到上面的typesfield:固定的字段设置dynamicField:动态的字段设置,用于后期自定义字段,*号通配符.例如:test_i就是int类型的动态字段.还有一个特殊的字段copyField,一般用于检索时用的字段这样就只对这一个字段进行索引分词就行了copyField的dest字段如果有多个source一定要设置multiValued=true,否则会报错的字段属性说明:属性 描述name 字段类型名class java类名indexed 缺省true。说明这个数据应被搜索和排序,如果数据没有indexed,则stored应是true。stored 缺省true。说明这个字段被包含在搜索结果中是合适的。如果数据没有stored,则indexed应是true。omitNorms 字段的长度不影响得分和在索引时不做boost时,设置它为true。一般文本字段不设置为true。termVectors 如果字段被用来做morelikethis和highlight的特性时应设置为true。compressed 字段是压缩的。这可能导致索引和搜索变慢,但会减少存储空间,只有StrField和TextField是可以压缩,这通常适合字段的长度超过200个字符。multiValued 字段多于一个值的时候,可设置为true。positionIncrementGap 和multiValued一起使用,设置多个值之间的虚拟空白的数量注意:_version_是一个特殊字段,不能删除,是记录当前索引版本号的.5.1.3.其他配置uniqueKey:唯一键,这里配置的是上面出现的fileds,一般是id、url等不重复的。在更新、删除的时候可以用到。defaultSearchField:默认搜索属性,如q=solr就是默认的搜索那个字段solrQueryParser:查询转换模式,是并且还是或者(AND/OR必须大写)5.2.solr配置solrconfig.xmlsolrconfig.xml这个配置文件可以在你下载solr包的安装解压目录的E:\Work\solr-4.2.0-src-idea\solr\example\solr\collection1\conf中找到,这个配置文件内容有点多,主要内容有:使用的lib配置,包含依赖的jar和Solr的一些插件;组件信息配置;索引配置和查询配置,下面详细说一下索引配置和查询配置.5.2.1索引indexConfigSolr性能因素,来了解与各种更改相关的性能权衡。表1概括了可控制Solr索引处理的各种因素:属性 描述useCompoundFile 通过将很多Lucene内部文件整合到一个文件来减少使用中的文件的数量。这可有助于减少Solr使用的文件句柄数目,代价是降低了性能。除非是应用程序用完了文件句柄,否则false的默认值应该就已经足够。ramBufferSizeMB 在添加或删除文档时,为了减少频繁的更些索引,Solr会选缓存在内存中,当内存中的文件大于设置的值,才会更新到索引库。较大的值可使索引时间变快但会牺牲较多的内存。如两个值同时设置,满足一个就会进行刷新索引.maxBufferedDocsmergeFactor 决定低水平的Lucene段被合并的频率。较小的值(最小为2)使用的内存较少但导致的索引时间也更慢。较大的值可使索引时间变快但会牺牲较多的内存。maxIndexingThreads indexWriter生成索引时使用的最大线程数unlockOnStartup unlockOnStartup告知Solr忽略在多线程环境中用来保护索引的锁定机制。在某些情况下,索引可能会由于不正确的关机或其他错误而一直处于锁定,这就妨碍了添加和更新。将其设置为true可以禁用启动锁定,进而允许进行添加和更新。lockType single:在只读索引或是没有其它进程修改索引时使用.native:使用操作系统本地文件锁,不能使用多个Solr在同一个JVM中共享一个索引.simple:使用一个文本文件锁定索引.5.2.2查询配置query属性 描述maxBooleanClauses 最大的BooleanQuery数量.当值超出时,抛出TooManyClausesException.注意这个是全局的,如果是多个SolrCore都会使用一个值,每个Core里设置不一样的化,会使用最后一个的.filterCache filterCache存储了无序的lucenedocumentid集合,1.存储了filterqueries(“fq”参数)得到的documentid集合结果。2还可用于facet查询3.3)如果配置了useFilterForSortedQuery,那么如果查询有filter,则使用filterCache。queryResultCache 缓存搜索结果,一个文档ID列表documentCache 缓存Lucene的Document对象,不会自热fieldValueCache 字段缓存使用文档ID进行快速访问。默认情况下创建fieldValueCache即使这里没有配置。enableLazyFieldLoading 若应用程序预期只会检索Document上少数几个Field,那么可以将属性设置为true。延迟加载的一个常见场景大都发生在应用程序返回和显示一系列搜索结果的时候,用户常常会单击其中的一个来查看存储在此索引中的原始文档。初始的显示常常只需要显示很短的一段信息。若考虑到检索大型Document的代价,除非必需,否则就应该避免加载整个文档。queryResultWindowSize 一次查询中存储最多的doc的id数目.queryResultMaxDocsCached 查询结果doc的最大缓存数量,例如要求每页显示10条,这里设置是20条,也就是说缓存里总会给你多出10条的数据.让你点示下一页时很快拿到数据.listener 选项定义newSearcher和firstSearcher事件,您可以使用这些事件来指定实例化新搜索程序或第一个搜索程序时应该执行哪些查询。如果应用程序期望请求某些特定的查询,那么在创建新搜索程序或第一个搜索程序时就应该反注释这些部分并执行适当的查询。useColdSearcher 是否使用冷搜索,为false时使用自热后的searchermaxWarmingSearchers 最大自热searcher数量5.3Solr加入中文分词器中文分词在solr里面是没有默认开启的,需要我们自己配置一个中文分词器。目前可用的分词器有smartcn,IK,Jeasy,庖丁。其实主要是两种,一种是基于中科院ICTCLAS的隐式马尔科夫HMM算法的中文分词器,如smartcn,ictclas4j,优点是分词准确度高,缺点是不能使用用户自定义词库;另一种是基于最大匹配的分词器,如IK,Jeasy,庖丁,优点是可以自定义词库,增加新词,缺点是分出来的垃圾词较多。各有优缺点看应用场合自己衡量选择吧。下面给出两种分词器的安装方法,任选其一即可,推荐第一种,因为smartcn就在solr发行包的contrib/analysis-extras/lucene-libs/下,就是lucene-analyzers-smartcn-4.2.0.jar,首选在solrconfig.xml中加一句引用analysis-extras的配置,这样我们自己加入的分词器才会引到的solr中.5.3.1.smartcn分词器的安装首选将发行包的contrib/analysis-extras/lucene-libs/lucene-analyzers-smartcn-4.2.0.jar复制到\solr\contrib\analysis-extras\lib下,在solr本地应用文件夹下,打开/solr/conf/scheme.xml,编辑text字段类型如下,添加以下代码到scheme.xml中的相应位置,就是找到fieldType定义的那一段,在下面多添加这一段就好啦如果需要检索某个字段,还需要在scheme.xml下面的field中,添加指定的字段,用text_smartcn作为type的名字,来完成中文分词。如text要实现中文检索的话,就要做如下的配置:5.3.2.IK分词器的安装首选要去下载IKAnalyzer的发行包.下载地址:http://ik-analyzer.googlecode.com/files/IK%20Analyzer%202012FF_hf1.zip.下载后解压出来文件中的三个复制到\solr\contrib\analysis-extras\lib目录中.IKAnalyzer2012FF_u1.jar分词器jar包IKAnalyzer.cfg.xml分词器配置文件Stopword.dic分词器停词字典,可自定义添加内容复制后就可以像smartcn一样的进行配置scheme.xml了.现在来验证下是否添加成功,首先使用StartSolrJetty来启动solr服务,启动过程中如果配置出错,一般有两个原因:一是配置的分词器jar找不到,也就是你没有复制jar包到\solr\contrib\analysis-extras\lib目前下;二是分词器版本不对导致的分词器接口API不一样出的错,要是这个错的话就在检查分词器的相关文档,看一下支持的版本是否一样.如果在启动过程中没有报错的话说明配置成功了.我们可以进入到http://localhost:8983/solr地址进行测试一下刚加入的中文分词器.在首页的CoreSelector中选择你配置的Croe后点击下面的Analysis,在AnalyseFieldname/FieldType里选择你刚才设置的字段名称或是分词器类型,在FieldValue(index)中输入:中国人,点击右面的分词就行了.6.Solr功能应用我这里主要使用SolrJ进行介绍一下Solr的一些基本应用,使用SolrJ加上EmbeddedSolrServer(嵌入式服务器),方便进行代码跟踪调试.在功能上和其它服务器都是一样的,它们都是继承的SolrServer来提供服务API的.EmbeddedSolrServer优点是不用起http协议,直接加载SolrCore进行操作,性能上应该是最快的,方便用于把Solr单结点服务嵌入到项目中使用.下面开始介绍Solr的功能的应用.EmbeddedSolrServer初始化:System.setProperty("solr.solr.home","E:\\Work\\solr-4.2.0-src\\solr\\example\\solr");CoreContainer.Initializerinitializer=newCoreContainer.Initializer();CoreContainercoreContainer=initializer.initialize();SolrServerserver=newEmbeddedSolrServer(coreContainer,"");6.1维护索引在一般系统中维护的都是增删改,在Solr中的维护功能是增删和优化功能,在Solr中的修改操作就是先删掉再添加.在做索引维护之前,首先要做的是配置schema.xml主要是按上面章节中的说明设置好字段信息(名称,类型,索引,存储,分词等信息),大概就像在数据库中新建一个表一样.设置好schema.xml就可以进行索引相关操作了.6.1.1增加索引在增加索引之前先可构建好SolrInputDocument对象.主要操作就是给文档添加字段和值.代码如下:SolrInputDocumentdoc=newSolrInputDocument();doc.setField("id","ABC");doc.setField("content","中华人民共和国");构建好文档后添加的上面初始化好的server里就行了.server.add(doc);server.commit();//这句一般不用加因为我们可以通过在配置文件中的//autoCommit来提高性能Solr在add文档时.如果文档不存在就直接添加,如果文档存在就删除后添加,这也就是修改功能了.判断文档是否存在的依据是定义好的uniqueKey字段.6.1.2删除索引删除索引可以通过两种方式操作,一种是通过文档ID进行删除,别一种是通过查询到的结果进行删除.通过ID删除方式代码:server.deleteById(id);//或是使用批量删除server.deleteById(ids);通过查询删除方式代码:server.deleteByQuery("*.*");//这样就删除了所有文档索引//”*.*”就查询所有内容的,介绍查询时会详细说明.6.1.2优化索引优化Lucene的索引文件以改进搜索性能。索引完成后执行一下优化通常比较好。如果更新比较频繁,则应该在使用率较低的时候安排优化。一个索引无需优化也可以正常地运行。优化是一个耗时较多的过程。server.optimize();//不要频繁的调用..尽量在无人使用时调用.6.2查询索引Solr在不修改任务配置的情况下就可以使用查询功能,在web项目中应用可以直接URL进行访问Solr服务器例如:http://localhost:8983/solr/collection1/select?q=*%3A*&wt=xml&indent=true上面的意思就是查询名为collection1的SolrCore的所有内容用xml格式返回并且有缩进。返回结果如下:<?xmlversion="1.0"encoding="UTF-8"?>00true*:*xmlE:\Reduced\军事\1539.txt2-142370173411624385680001162438568000[俄罗斯lenta网站2006年2月9日报道]俄空军副总司令比热耶夫中将称,2006年春天独联体国家防空系统打击范围向西推进150千米,侦察范围向西推进400千米。  2006年3月白俄罗斯4个S-300PS防空导弹营担负战斗任务,使独联体防空系统作战范围得以向西推进。比热耶夫中将还宣布,近期乌兹别克斯坦可能加入独联体防空系统。  独联体国家防空系统建于9年前,共有9个国家参加该组织。目前只有亚美尼亚、白俄罗斯、哈萨克斯坦、吉尔吉斯、俄罗斯和塔吉克斯坦支持该体系。  乌克兰、乌兹别克斯坦与俄罗斯在双边基础上合作,格鲁吉亚和土库曼最近7年不参加独联体国家对空防御。E3798D82-EAB6-2BEA-D7E2-79FBD102E8451436361868021071872…上面所看到的就是用xml格式返回的查询结果,其中的doc就是一个文档,在doc里面的那个就是我们开始在schema.xml中定义的字段.如果使用SolrJ进行调用的话代码如下:SolrQueryquery=newSolrQuery();query.set("q","*.*");QueryResponsersp=server.query(query)SolrDocumentListlist=rsp.getResults();返回结果在SolrDocumentList中在这个对象中遍历取出值来:for(inti=0;i<list.size();i++){SolrDocumentsd=list.get(i);Stringid=(String)sd.getFieldValue("id");System.out.println(id);}6.2.1查询参数名称 描述q 查询字符串,必须的。fq filterquery。使用FilterQuery可以充分利用FilterQueryCache,提高检索性能。作用:在q查询符合结果中同时是fq查询符合的,例如:q=mm&fq=date_time:[20081001TO20091031],找关键字mm,并且date_time是20081001到20091031之间的。fl fieldlist。指定返回结果字段。以空格“”或逗号“,”分隔。start 用于分页定义结果起始记录数,默认为0。rows 用于分页定义结果每页返回记录数,默认为10。sort 排序,格式:sort=+[,+]…。示例:(inStockdesc,priceasc)表示先“inStock”降序,再“price”升序,默认是相关性降序。df 默认的查询字段,一般默认指定。q.op 覆盖schema.xml的defaultOperator(有空格时用"AND"还是用"OR"操作逻辑),一般默认指定。必须大写wt writertype。指定查询输出结构格式,默认为“xml”。在solrconfig.xml中定义了查询输出格式:xml、json、python、ruby、php、phps、custom。qt querytype,指定查询使用的QueryHandler,默认为“standard”。explainOther 设置当debugQuery=true时,显示其他的查询说明。defType 设置查询解析器名称。timeAllowed 设置查询超时时间。omitHeader 设置是否忽略查询结果返回头信息,默认为“false”。indent 返回的结果是否缩进,默认关闭,用indent=true|on开启,一般调试json,php,phps,ruby输出才有必要用这个参数。version 查询语法的版本,建议不使用它,由服务器指定默认值。debugQuery设置返回结果是否显示Debug信息。6.2.2查询语法1.匹配所有文档:*:*2.强制、阻止和可选查询:1)Mandatory:查询结果中必须包括的(forexample,onlyentrynamecontainingthewordmake)Solr/LuceneStatement:+make,+make+up,+make+up+kiss2)prohibited:(forexample,alldocumentsexceptthosewithwordbelieve)Solr/LuceneStatement:+make+up-kiss3)optional:Solr/LuceneStatement:+make+upkiss3.布尔操作:AND、OR和NOT布尔操作(必须大写)与Mandatory、optional和prohibited相似。1)makeANDup=+make+up:AND左右两边的操作都是mandatory2)make||up=makeORup=makeup:OR左右两边的操作都是optional3)+make+upNOTkiss=+make+up–kiss4)makeANDupORfrenchANDKiss不可以达到期望的结果,因为AND两边的操作都是mandatory的。4.子表达式查询(子查询):可以使用“()”构造子查询。示例:(makeANDup)OR(frenchANDKiss)5.子表达式查询中阻止查询的限制:示例:make(-up):只能取得make的查询结果;要使用make(-up*:*)查询make或者不包括up的结果。6.多字段fields查询:通过字段名加上分号的方式(fieldName:query)来进行查询示例:entryNm:makeANDentryId:3cdc86e8e0fb4da8ab17caed42f6760c7.通配符查询(wildCardQuery):1)通配符?和*:“*”表示匹配任意字符;“?”表示匹配出现的位置。示例:ma?*(ma后面的一个位置匹配),ma??*(ma后面两个位置都匹配)2)查询字符必须要小写:+Ma+be**可以搜索到结果;+Ma+Be**没有搜索结果.3)查询速度较慢,尤其是通配符在首位:主要原因一是需要迭代查询字段中的每个term,判断是否匹配;二是匹配上的term被加到内部的查询,当terms数量达到1024的时候,查询会失败。4)Solr中默认通配符不能出现在首位(可以修改QueryParser,设置setAllowLeadingWildcard为true)5)setsetAllowLeadingWildcardtotrue.8.模糊查询、相似查询:不是精确的查询,通过对查询的字段进行重新插入、删除和转换来取得得分较高的查询解决(由LevensteinDistanceAlgorithm算法支持)。1)一般模糊查询:示例:make-believ~2)门槛模糊查询:对模糊查询可以设置查询门槛,门槛是0~1之间的数值,门槛越高表面相似度越高。示例:make-believ~0.5、make-believ~0.8、make-believ~0.99.范围查询(RangeQuery):Lucene支持对数字、日期甚至文本的范围查询。结束的范围可以使用“*”通配符。示例:1)日期范围(ISO-8601时间GMT):sa_type:2ANDa_begin_date:[1990-01-01T00:00:00.000ZTO1999-12-31T24:59:99.999Z]2)数字:salary:[2000TO*]3)文本:entryNm:[aTOa]10.日期匹配:YEAR,MONTH,DAY,DATE(synonymouswithDAY)HOUR,MINUTE,SECOND,MILLISECOND,andMILLI(synonymouswithMILLISECOND)可以被标志成日期。示例:1)r_event_date:[*TONOW-2YEAR]:2年前的现在这个时间2)r_event_date:[*TONOW/DAY-2YEAR]:2年前前一天的这个时间6.2.3函数查询(FunctionQuery)函数查询可以利用numeric字段的值或者与字段相关的的某个特定的值的函数,来对文档进行评分。1.使用函数查询的方法这里主要有三种方法可以使用函数查询,这三种s方法都是通过solrhttp接口的。1)使用FunctionQParserPlugin。ie:q={!func}log(foo)2)使用“_val_”内嵌方法内嵌在正常的solr查询表达式中。即,将函数查询写在q这个参数中,这时候,我们使用“_val_”将函数与其他的查询加以区别。ie:entryNm:make&&_val_:ord(entryNm)3)使用dismax中的bf参数使用明确为函数查询的参数,比如说dismax中的bf(boostfunction)这个参数。注意:bf这个参数是可以接受多个函数查询的,它们之间用空格隔开,它们还可以带上权重。所以,当我们使用bf这个参数的时候,我们必须保证单个函数中是没有空格出现的,不然程序有可能会以为是两个函数。示例:q=dismax&bf="ord(popularity)^0.5recip(rord(price),1,1000,1000)^0.32.函数的格式(FunctionQuerySyntax)目前,functionquery并不支持a+b这样的形式,我们得把它写成一个方法形式,这就是sum(a,b).3.使用函数查询注意事项1)用于函数查询的field必须是被索引的;2)字段不可以是多值的(multi-value)4.可以利用的函数(availablefunction)1)constant:支持有小数点的常量;例如:1.5;SolrQuerySyntax:_val_:1.52)fieldvalue:这个函数将会返回numericfield的值,这个字段必须是indexd的,非multiValued的。格式很简单,就是该字段的名字。如果这个字段中没有这样的值,那么将会返回0。3)ord:对于一个字段,它所有的值都将会按照字典顺序排列,这个函数返回你要查询的那个特定的值在这个顺序中的排名。这个字段,必须是非multiValued的,当没有值存在的时候,将返回0。例如:某个特定的字段只能去三个值,“apple”、“banana”、“pear”,那么ord(“apple”)=1,ord(“banana”)=2,ord(“pear”)=3.需要注意的是,ord()这个函数,依赖于值在索引中的位置,所以当有文档被删除、或者添加的时候,ord()的值就会发生变化。当你使用MultiSearcher的时候,这个值也就是不定的了。4)rord:这个函数将会返回与ord相对应的倒排序的排名。格式:rord(myIndexedField)。5)sum:这个函数的意思就显而易见啦,它就是表示“和”啦。格式:sum(x,1)、sum(x,y)、sum(sqrt(x),log(y),z,0.5)6)product:product(x,y,...)将会返回多个函数的乘积。格式:product(x,2)、product(x,y)7)div:div(x,y)表示x除以y的值,格式:div(1,x)、div(sum(x,100),max(y,1))8)pow:pow表示幂值。pow(x,y)=x^y。例如:pow(x,0.5)表示开方pow(x,log(y))9)abs:abs(x)将返回表达式的绝对值。格式:abs(-5)、abs(x)10)log:log(x)将会返回基数为10,x的对数。格式:log(x)、log(sum(x,100))11)Sqrt:sqrt(x)返回一个数的平方根。格式:sqrt(2)、sqrt(sum(x,100))12)Map:如果x>=min,且x<=max,那么map(x,min,max,target)=target.如果x不在[min,max]这个区间内,那么map(x,min,max,target)=x.格式:map(x,0,0,1)13)Scale:scale(x,minTarget,maxTarget)这个函数将会把x的值限制在[minTarget,maxTarget]范围内。14)query:query(subquery,default)将会返回给定subquery的分数,如果subquery与文档不匹配,那么将会返回默认值。任何的查询类型都是受支持的。可以通过引用的方式,也可以直接指定查询串。例子:q=product(popularity,query({!dismaxv='solrrocks'})将会返回popularity和通过dismax查询得到的分数的乘积。q=product(popularity,query($qq)&qq={!dismax}solrrocks跟上一个例子的效果是一样的。不过这里使用的是引用的方式q=product(popularity,query($qq,0.1)&qq={!dismax}solrrocks在前一个例子的基础上又加了一个默认值。15)linear:inear(x,m,c)表示m*x+c,其中m和c都是常量,x是一个变量也可以是一个函数。例如:linear(x,2,4)=2*x+4.16)Recip:recip(x,m,a,b)=a/(m*x+b)其中,m、a、b是常量,x是变量或者一个函数。当a=b,并且x>=0的时候,这个函数的最大值是1,值的大小随着x的增大而减小。例如:recip(rord(creationDate),1,1000,1000)17)Max:max(x,c)将会返回一个函数和一个常量之间的最大值。例如:max(myfield,0)6.3高亮显示我们经常使用搜索引擎,比如在baidu搜索java,会出现如下结果,结果中与关键字匹配的地方是红色显示与其他内容区别开来。solr默认已经配置了highlight组件(详见SOLR_HOME/conf/sorlconfig.xml)。通常我出只需要这样请求http://localhost:8983/solr/collection1/select?q=%E4%B8%AD%E5%9B%BD&start=0&rows=1&fl=content+path+&wt=xml&indent=true&hl=true&hl.fl=content可以看到与比一般的请求多了两个参数"hl=true"和"hl.fl=content"。"hl=true"是开启高亮,"hl.fl=content"是告诉solr对name字段进行高亮(如果你想对多个字段进行高亮,可以继续添加字段,字段间用逗号隔开,如"hl.fl=name,name2,name3")。高亮内容与关键匹配的地方,默认将会被" "和""包围。还可以使用hl.simple.pre"和"hl.simple.post"参数设置前后标签.查询结果如下:<?xmlversion="1.0"encoding="UTF-8"?>[code][code][code][code]0[code]2[code][code]contentpath[code]true[code]0[code]中国[code] [code][code]content[code]xml[code]true[code]1[code][code][code][code][code]E:\Reduced\IT\630.txt[code]  本报讯中国银联股份有限公司和中国电信集团日前在北京签署全面战略合作协议。这标志着中国银联和中国电信将在通信服务、信息增值服务、新型支付产品合作开发等领域建立全面合作伙伴关系。  据悉,双方签署的全面战略合作协议主要内容是:中国银联将选择中国电信作为通信信息服务的主要提供商,双方围绕提高中国银联内部通信的水平和销售网络的服务水平开展全面、深入的合作;中国电信选择中国银联作为银行卡转接支付服务的主要提供商,并围绕开发、推广新型支付终端产品和增值服务开展全面合作。(辛华)[code][code][code][code][code]  本报讯 中国银联股份有限公司和 中国电信集团日前在北京签署全面战略合作协议。这标志着 中国银联和 中国电信将在通信服务、信息增值服务、新型支付产品合作开发等领域建立全面合作伙伴关系。  据悉,双方签署[code][code][code]使用SolrJ方法基本一样也是设置这些个参数,只不过是SolrJ封装起来了,代码如下:SolrQueryquery=newSolrQuery();query.set("q","*.*");query.setHighlight(true);//开启高亮组件query.addHighlightField("content");//高亮字段query.setHighlightSimplePre(PRE_TAG);//标记query.setHighlightSimplePost(POST_TAG);QueryResponsersp=server.query(query)//…上面取结果的代码//取出高亮结果if(rsp.getHighlighting()!=null){if(rsp.getHighlighting().get(id)!=null){//先通过结果中的ID到高亮集合中取出文档高亮信息Map<String,List>map=rsp.getHighlighting().get(id);//取出高亮片段if(map.get(name)!=null){for(Strings:map.get(name)){System.out.println(s);}}}6.4拼写检查首先配置solrconfig.xml,文件可能已经有这两个元素(如果没有添加即可),需要根据我们自己的系统环境做些适当的修改。text_spelldirectspellsolr.DirectSolrSpellCheckerinternal0.521520.01directontruetruespellcheck配置完成之后,我们进行一下测试,重启Solr后,访问如下链接http://localhost:8983/solr/collection1/spell?wt=xml&indent=true&spellcheck=true&spellcheck.q=%E4%B8%AD%E5%9B%BD<?xmlversion="1.0"encoding="UTF-8"?>00103beijing使用SolrJ时也同样加入参数就可以SolrQueryquery=newSolrQuery();query.set("q","*.*");query.set("qt","/spell");QueryResponsersp=server.query(query)//…上面取结果的代码SpellCheckResponsespellCheckResponse=rsp.getSpellCheckResponse();if(spellCheckResponse!=null){Stringcollation=spellCheckResponse.getCollatedResult();}6.5检索建议检索建议目前是各大搜索的标配应用,主要作用是避免用户输入错误的搜索词,同时将用户引导到相应的关键词搜索上。Solr内置了检索建议功能,它在Solr里叫做Suggest模块.该模块可选择基于提示词文本做检索建议,还支持通过针对索引的某个字段建立索引词库做检索建议。在诸多文档中都推荐使用基于索引来做检索建议,因此我们目前的实现也是采取该方案。现在我们开始配置Suggest模块,首先在solrconfig.xml文件中配置Suggest依赖的SpellChecker模块,然后再配置Suggest模块,所以这两个都需要配置。stringsuggestorg.apache.solr.spelling.suggest.Suggesterorg.apache.solr.spelling.suggest.tst.TSTLookuptext0.0001spellcheckerfreqtrueidtext附2:solrconfig.xml<?xmlversion="1.0"encoding="UTF-8"?>LUCENE_42${solr.data.dir:}100100050${solr.lock.type:native}1024true20200false2explicit10textexplicitjsontruetexttruejsontrueexplicitvelocitybrowselayoutSolritasedismaxtext^0.5features^1.0name^1.2sku^1.5id^10.0manu^1.1cat^1.4title^10.0description^5.0keywords^5.0author^2.0resourcename^1.0text100%*:*10*,scoretext^0.5features^1.0name^1.2sku^1.5id^10.0manu^1.1cat^1.4title^10.0description^5.0keywords^5.0author^2.0resourcename^1.0text,features,name,sku,id,manu,cat,title,description,keywords,author,resourcename3oncatmanu_exactcontent_typeauthor_sipodGB1cat,inStockafterprice060050popularity0103manufacturedate_dtNOW/YEAR-10YEARSNOW+1YEARbeforeafteroncontentfeaturestitlenamehtml 0title0name3200content750onfalse525truetrue53spellcheckapplication/jsonapplication/csvtrueignored_truelinksignored_solrpingqueryallexplicittruedirectspellsolr.DirectSolrSpellCheckerinternal0.521520.001truedefaultsolr.IndexBasedSpellCheckerspell./spellchecker10.7truejarowinklersolr.IndexBasedSpellCheckerspellorg.apache.lucene.search.spell.JaroWinklerDistance./spellchecker2truedefaultorg.carrot2.clustering.lingo.LingoClusteringAlgorithm20explicittruedefaulttruecategory_scontenttrueclusteringtruefalsetermsstringelevate.xmlexplicittextelevator100700.5[-\w,/\n\"']{20,200}]]>]]>,,,,,,,,,]]>]]>10.,!?WORDenUStext/plain;charset=UTF-85*:*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值