精华内容
下载资源
问答
  • Solr调研总结开发类型全文检索相关开发Solr版本4.2文件内容本文介绍solr的功能使用及相关注意事项;主要包括以下内容:环境搭建及调试;两个核心配置文件介绍;维护索引;查询索引,和在查询中可以应用的高亮显示、拼写...

    Solr调研总结开发类型全文检索相关开发

    Solr版本4.2

    文件内容本文介绍solr的功能使用及相关注意事项;主要包括以下内容:环境搭建及调试;两个核心配置文件介绍;维护索引;查询索引,和在查询中可以应用的高亮显示、拼写检查、搜索建议、分组统计、拼音检索等功能的使用方法。

    版本作者/修改人日期

    V1.0gzk2013-06-04

    1. Solr 是什么?

    Solr它是一种开放源码的、基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中。Solr 提供了层面搜索(就是统计)、命中醒目显示并且支持多种输出格式(包括XML/XSLT 和JSON等格式)。它易于安装和配置,而且附带了一个基于HTTP 的管理界面。可以使用 Solr 的表现优异的基本搜索功能,也可以对它进行扩展从而满足企业的需要。Solr的特性包括:高级的全文搜索功能

    专为高通量的网络流量进行的优化

    基于开放接口(XML和HTTP)的标准

    综合的HTML管理界面

    可伸缩性-能够有效地复制到另外一个Solr搜索服务器

    使用XML配置达到灵活性和适配性

    可扩展的插件体系

    2. Lucene 是什么?

    Lucene是一个基于Java的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta(雅加达) 家族中的一个开源项目。也是目前最为流行的基于Java开源全文检索工具包。目前已经有很多应用程序的搜索功能是基于 Lucene ,比如Eclipse 帮助系统的搜索功能。Lucene能够为文本类型的数据建立索引,所以你只要把你要索引的数据格式转化的文本格式,Lucene 就能对你的文档进行索引和搜索。

    3. Solr vs Lucene

    Solr与Lucene 并不是竞争对立关系,恰恰相反Solr 依存于Lucene,因为Solr底层的核心技术是使用Lucene 来实现的,Solr和Lucene的本质区别有以下三点:搜索服务器,企业级和管理。Lucene本质上是搜索库,不是独立的应用程序,而Solr是。Lucene专注于搜索底层的建设,而Solr专注于企业应用。Lucene不负责支撑搜索服务所必须的管理,而Solr负责。所以说,一句话概括 Solr: Solr是Lucene面向企业搜索应用的扩展。

    Solr与Lucene架构图:

    179412144_2_20200102022355269_wm

    Solr使用Lucene并且扩展了它!一个真正的拥有动态字段(Dynamic Field)和唯一键(Unique Key)的数据模式(Data Schema)

    对Lucene查询语言的强大扩展!

    支持对结果进行动态的分组和过滤

    高级的,可配置的文本分析

    高度可配置和可扩展的缓存机制

    性能优化

    支持通过XML进行外部配置

    拥有一个管理界面

    可监控的日志

    支持高速增量式更新(Fast incremental Updates)和快照发布(Snapshot Distribution)

    4.搭建并调试Solr

    4.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下载并设置Apache Ant

    Solr是使用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文件,这个文件需要我们建立。现在就可以进行build Solr源码了。在命令行窗口中进入到你的Solr源码目录,输入ant会出现当前build.xml使用提示信息。

    179412144_4_20200102022356190_wm

    其它的先不用管它,我们只要针对我们使用的IDE进行build就行了,如果使用eclipse就在命令行输入:ant eclipse.如果使用IntelliJ IDEA 就在命令行输入:ant idea。这样就能进行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首选都要设置Solr Home在IDE的JVM参数设置VM arguments写入 -Dsolr.solr.home=solr/example/solr一般就行了.不行也可以使用绝对路径.

    solr使用StartSolrJetty文件作为入口文件进行调试代码,在这里可以设置服务器使用的端口和solr的webapps目录.一般都不用设置,默认的就可以进行调试.Solr Home也能可在代码中设置一样好用.  System.setProperty("solr.solr.home", "E:\\Work\\solr-4.2.0-src-idea\\solr\\example\\solr");

    目前是使用自带的一个example作为solr配置的根目录,如果你有其他的solr配置目录,设置之即可。点击run即可,debug也是一样可以用了。没有别的问题就应该能运行了.注意servlet 容器使用的端口,如查提示:

    FAILED SocketConnector@0.0.0.0:8983: java.net.BindException: Address already in use: JVM_Bind 就说明当前端口占用中.改一下就可以了.如果没有报错启动成功后就可以在浏览器中输入地址: http://localhost:8983/solr/ 就可以看到如下界面

    179412144_6_2020010202235765_wm

    到这里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 中列出的重要属性的子集:属性名称描述

    IndexedIndexed Field 可以进行搜索和排序。你还可以在 indexed Field 上运行 Solr 分析过程,此过程可修改内容以改进或更改结果。

    Storedstored Field 内容保存在索引中。这对于检索和醒目显示内容很有用,但对于实际搜索则不是必需的。例如,很多应用程序存储指向内容位置的指针而不是存储实际的文件内容。

    5.1模式配置Schema.xml

    schema.xml这个配置文件可以在你下载solr包的安装解压目录的\solr\example\solr\collection1\conf中找到,它就是solr模式关联的文件。打开这个配置文件,你会发现有详细的注释。模式组织主要分为三个重要配置

    5.1.1. types 部分

    是一些常见的可重用定义,定义了 Solr(和 Lucene)如何处理 Field。也就是添加到索引中的xml文件属性中的类型,如int、text、date等.

    179412144_7_20200102022357644

    179412144_8_20200102022357784_wm

    参数说明:属性描述

    name标识而已

    class和其他属性决定了这个fieldType的实际行为。

    sortMissingLast设置成true没有该field的数据排在有该field的数据之后,而不管请求时的排序规则, 默认是设置成false。

    sortMissingFirst跟上面倒过来呗。 默认是设置成false

    analyzer字段类型指定的分词器

    type当前分词用用于的操作.index代表生成索引时使用的分词器query代码在查询时使用的分词器

    tokenizer分词器类

    filter分词后应用的过滤器  过滤器调用顺序和配置相同.

    5.1.2. fileds

    是你添加到索引文件中出现的属性名称,而声明类型就需要用到上面的types

    179412144_9_2020010202235850_wm

    179412144_10_20200102022358378

    field: 固定的字段设置dynamicField: 动态的字段设置,用于后期自定义字段,*号通配符.例如: test_i就是int类型的动态字段.

    还有一个特殊的字段copyField,一般用于检索时用的字段这样就只对这一个字段进行索引分词就行了copyField的dest字段如果有多个source一定要设置multiValued=true,否则会报错的

    179412144_11_20200102022358519

    字段属性说明:属性描述

    name字段类型名

    classjava类名

    indexed缺省true。 说明这个数据应被搜索和排序,如果数据没有indexed,则stored应是true。

    stored缺省true。说明这个字段被包含在搜索结果中是合适的。如果数据没有stored,则indexed应是true。

    omitNorms字段的长度不影响得分和在索引时不做boost时,设置它为true。

    一般文本字段不设置为true。

    termVectors如果字段被用来做more like this 和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.xml

    solrconfig.xml这个配置文件可以在你下载solr包的安装解压目录的E:\Work\solr-4.2.0-src-idea\solr\example\solr\collection1\conf中找到,这个配置文件内容有点多,主要内容有:使用的lib配置,包含依赖的jar和Solr的一些插件;组件信息配置;索引配置和查询配置,下面详细说一下索引配置和查询配置.

    5.2.1索引indexConfig

    Solr 性能因素,来了解与各种更改相关的性能权衡。 表 1 概括了可控制 Solr 索引处理的各种因素:属性描述

    useCompoundFile通过将很多 Lucene 内部文件整合到一个文件来减少使用中的文件的数量。这可有助于减少 Solr 使用的文件句柄数目,代价是降低了性能。除非是应用程序用完了文件句柄,否则 false 的默认值应该就已经足够。

    ramBufferSizeMB在添加或删除文档时,为了减少频繁的更些索引,Solr会选缓存在内存中,当内存中的文件大于设置的值,才会更新到索引库。较大的值可使索引时间变快但会牺牲较多的内存。如两个值同时设置,满足一个就会进行刷新索引.

    maxBufferedDocs

    mergeFactor决定低水平的 Lucene 段被合并的频率。较小的值(最小为 2)使用的内存较少但导致的索引时间也更慢。较大的值可使索引时间变快但会牺牲较多的内存。

    maxIndexingThreadsindexWriter生成索引时使用的最大线程数

    unlockOnStartupunlockOnStartup 告知 Solr 忽略在多线程环境中用来保护索引的锁定机制。在某些情况下,索引可能会由于不正确的关机或其他错误而一直处于锁定,这就妨碍了添加和更新。将其设置为 true 可以禁用启动锁定,进而允许进行添加和更新。

    lockTypesingle: 在只读索引或是没有其它进程修改索引时使用.

    native: 使用操作系统本地文件锁,不能使用多个Solr在同一个JVM中共享一个索引.

    simple :使用一个文本文件锁定索引.

    5.2.2 查询配置query属性描述

    maxBooleanClauses最大的BooleanQuery数量. 当值超出时,抛出 TooManyClausesException.注意这个是全局的,如果是多个SolrCore都会使用一个值,每个Core里设置不一样的化,会使用最后一个的.

    filterCachefilterCache存储了无序的lucene document id集合,1.存储了filter queries(“fq”参数)得到的document id集合结果。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时使用自热后的searcher

    maxWarmingSearchers最大自热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中.

    179412144_12_20200102022358675

    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定义的那一段,在下面多添加这一段就好啦

    179412144_13_20200102022358847_wm

    如果需要检索某个字段,还需要在scheme.xml下面的field中,添加指定的字段,用text_ smartcn作为type的名字,来完成中文分词。如 text要实现中文检索的话,就要做如下的配置:

    179412144_14_20200102022359222

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

    179412144_15_20200102022359347

    179412144_16_20200102022359456

    现在来验证下是否添加成功,首先使用StartSolrJetty来启动solr服务,启动过程中如果配置出错,一般有两个原因:一是配置的分词器jar找不到,也就是你没有复制jar包到\solr\contrib\analysis-extras\lib目前下;二是分词器版本不对导致的分词器接口API不一样出的错,要是这个错的话就在检查分词器的相关文档,看一下支持的版本是否一样.

    如果在启动过程中没有报错的话说明配置成功了.我们可以进入到http://localhost:8983/solr地址进行测试一下刚加入的中文分词器.在首页的Core Selector中选择你配置的Croe后点击下面的Analysis,在Analyse Fieldname / FieldType里选择你刚才设置的字段名称或是分词器类型,在Field Value(index)中输入:中国人,点击右面的分词就行了.

    6.Solr功能应用

    我这里主要使用SolrJ进行介绍一下Solr的一些基本应用,使用SolrJ加上EmbeddedSolrServer(嵌入式服务器),方便进行代码跟踪调试.在功能上和其它服务器都是一样的,它们都是继承的SolrServer来提供服务API的. EmbeddedSolrServer优点是不用起http协议,直接加载SolrCore进行操作,性能上应该是最快的,方便用于把Solr单结点服务嵌入到项目中使用.下面开始介绍Solr的功能的应用.EmbeddedSolrServer初始化:

    179412144_17_20200102022359644_wmSystem.setProperty("solr.solr.home", "E:\\Work\\solr-4.2.0-src\\solr\\example\\solr");

    CoreContainer.Initializer initializer = new CoreContainer.Initializer();

    CoreContainer  coreContainer = initializer.initialize();

    SolrServer  server = new EmbeddedSolrServer(coreContainer, "");

    6.1维护索引

    在一般系统中维护的都是增删改,在Solr中的维护功能是增删和优化功能,在Solr中的修改操作就是先删掉再添加.在做索引维护之前,首先要做的是配置schema.xml主要是按上面章节中的说明设置好字段信息(名称,类型,索引,存储,分词等信息),大概就像在数据库中新建一个表一样.设置好schema.xml就可以进行索引相关操作了.

    6.1.1增加索引

    在增加索引之前先可构建好SolrInputDocument对象.主要操作就是给文档添加字段和值.代码如下:

    179412144_18_20200102022359737SolrInputDocument doc = new SolrInputDocument();

    doc.setField("id", "ABC");

    doc.setField("content", "中华人民共和国");

    构建好文档后添加的上面初始化好的server里就行了.

    179412144_19_20200102022359831server.add(doc);

    server.commit();//这句一般不用加因为我们可以通过在配置文件中的

    //autoCommit来提高性能

    Solr在add文档时.如果文档不存在就直接添加,如果文档存在就删除后添加,这也就是修改功能了.判断文档是否存在的依据是定义好的uniqueKey字段.

    6.1.2删除索引

    删除索引可以通过两种方式操作,一种是通过文档ID进行删除,别一种是通过查询到的结果进行删除.

    通过ID删除方式代码:

    179412144_20_20200102022359956server.deleteById(id);

    //或是使用批量删除

    server.deleteById(ids);

    通过查询删除方式代码:

    179412144_21_20200102022400112server.deleteByQuery("*.*");//这样就删除了所有文档索引

    //”*.*”就查询所有内容的,介绍查询时会详细说明.

    6.1.2优化索引

    优化Lucene 的索引文件以改进搜索性能。索引完成后执行一下优化通常比较好。如果更新比较频繁,则应该在使用率较低的时候安排优化。一个索引无需优化也可以正常地运行。优化是一个耗时较多的过程。

    179412144_22_20200102022400222server.optimize();//不要频繁的调用..尽量在无人使用时调用.

    6.2查询索引

    Solr在不修改任务配置的情况下就可以使用查询功能,在web项目中应用可以直接URL进行访问Solr服务器例如 :http://localhost:8983/solr/ collection1/select?q=*%3A*&wt=xml&indent=true

    上面的意思就是查询名为collection1的SolrCore的所有内容用xml格式返回并且有缩进。

    返回结果如下:

    179412144_23_20200102022400425_wm<?xml version="1.0" encoding="UTF-8"?>

    0

    0

    true

    *:*

    xml

    E:\Reduced\军事\1539.txt

    2

    -1423701734

    1162438568000

    1162438568000

    [俄罗斯lenta网站2006年2月9日报道]俄空军副总司令比热耶夫中将称,2006年春天独联体国家防空系统打击范围向西推进150千米,侦察范围向西推进400千米。  2006年3月白俄罗斯4个S-300PS防空导弹营担负战斗任务,使独联体防空系统作战范围得以向西推进。比热耶夫中将还宣布,近期乌兹别克斯坦可能加入独联体防空系统。  独联体国家防空系统建于9年前,共有9个国家参加该组织。目前只有亚美尼亚、白俄罗斯、哈萨克斯坦、吉尔吉斯、俄罗斯和塔吉克斯坦支持该体系。  乌克兰、乌兹别克斯坦与俄罗斯在双边基础上合作,格鲁吉亚和土库曼最近7年不参加独联体国家对空防御。

    E3798D82-EAB6-2BEA-D7E2-79FBD102E845

    1436361868021071872

    上面所看到的就是用xml格式返回的查询结果,其中的doc就是一个文档,在doc里面的那个就是我们开始在schema.xml中定义的字段.

    如果使用SolrJ进行调用的话代码如下:

    179412144_24_20200102022400862_wmSolrQuery query = new SolrQuery();

    query.set("q","*.*");

    QueryResponse rsp =server.query(query)

    SolrDocumentList list = rsp.getResults();

    返回结果在SolrDocumentList中在这个对象中遍历取出值来:

    179412144_25_20200102022400987_wmfor (int i = 0; i < list.size(); i++) {

    SolrDocument sd = list.get(i);

    String id = (String) sd.getFieldValue("id");

    System.out.println(id);

    }

    6.2.1查询参数名称描述

    q查询字符串,必须的。

    fqfilter query。使用Filter Query可以充分利用Filter Query Cache,提高检索性能。作用:在q查询符合结果中同时是fq查询符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找关键字mm,并且date_time是20081001到20091031之间的。

    flfield list。指定返回结果字段。以空格“ ”或逗号“,”分隔。

    start用于分页定义结果起始记录数,默认为0。

    rows用于分页定义结果每页返回记录数,默认为10。

    sort排序,格式:sort=+[,+]… 。示例:(inStock desc, price asc)表示先 “inStock” 降序, 再 “price” 升序,默认是相关性降序。

    df默认的查询字段,一般默认指定。

    q.op覆盖schema.xml的defaultOperator(有空格时用"AND"还是用"OR"操作逻辑),一般默认指定。必须大写

    wtwriter type。指定查询输出结构格式,默认为“xml”。在solrconfig.xml中定义了查询输出格式:xml、json、python、ruby、php、phps、custom。

    qtquery type,指定查询使用的Query Handler,默认为“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:查询结果中必须包括的(for example, only entry name containing the word make)

    Solr/Lucene Statement:+make, +make +up ,+make +up +kiss

    2)prohibited:(for example, all documents except those with word believe)

    Solr/Lucene Statement:+make +up -kiss

    3)optional:

    Solr/Lucene Statement:+make +up kiss

    3.布尔操作:AND、OR和NOT布尔操作(必须大写)与Mandatory、optional和prohibited相似。

    1)make AND up = +make +up :AND左右两边的操作都是mandatory

    2)make || up = make OR up=make up :OR左右两边的操作都是optional

    3)+make +up NOT kiss = +make +up –kiss

    4)make AND up OR french AND Kiss不可以达到期望的结果,因为AND两边的操作都是mandatory的。

    4. 子表达式查询(子查询):可以使用“()”构造子查询。

    示例:(make AND up) OR (french AND Kiss)

    5.子表达式查询中阻止查询的限制:

    示例:make (-up):只能取得make的查询结果;要使用make (-up *:*)查询make或者不包括up的结果。

    6.多字段fields查询:通过字段名加上分号的方式(fieldName:query)来进行查询

    示例:entryNm:make AND entryId:3cdc86e8e0fb4da8ab17caed42f6760c

    7.通配符查询(wildCard Query):

    1)通配符?和*:“*”表示匹配任意字符;“?”表示匹配出现的位置。

    示例:ma?*(ma后面的一个位置匹配),ma??*(ma后面两个位置都匹配)

    2)查询字符必须要小写:+Ma +be**可以搜索到结果;+Ma +Be**没有搜索结果.

    3)查询速度较慢,尤其是通配符在首位:主要原因一是需要迭代查询字段中的每个term,判断是否匹配;二是匹配上的term被加到内部的查询,当terms数量达到1024的时候,查询会失败。

    4)Solr中默认通配符不能出现在首位(可以修改QueryParser,设置

    setAllowLeadingWildcard为true)

    5)set setAllowLeadingWildcard to true.

    8.模糊查询、相似查询:不是精确的查询,通过对查询的字段进行重新插入、删除和转换来取得得分较高的查询解决(由Levenstein Distance Algorithm算法支持)。

    1)一般模糊查询:示例:make-believ~

    2)门槛模糊查询:对模糊查询可以设置查询门槛,门槛是0~1之间的数值,门槛越高表面相似度越高。示例:make-believ~0.5、make-believ~0.8、make-believ~0.9

    9.范围查询(Range Query):Lucene支持对数字、日期甚至文本的范围查询。结束的范围可以使用“*”通配符。

    示例:

    1)日期范围(ISO-8601 时间GMT):sa_type:2 AND a_begin_date:[1990-01-01T00:00:00.000Z TO 1999-12-31T24:59:99.999Z]

    2)数字:salary:[2000 TO *]

    3)文本:entryNm:[a TO a]

    10.日期匹配:YEAR, MONTH, DAY, DATE (synonymous with DAY) HOUR, MINUTE, SECOND, MILLISECOND, and MILLI (synonymous with MILLISECOND)可以被标志成日期。

    示例:

    1)r_event_date:[* TO NOW-2YEAR]:2年前的现在这个时间

    2)r_event_date:[* TO NOW/DAY-2YEAR]:2年前前一天的这个时间

    6.2.3函数查询(Function Query)

    函数查询 可以利用 numeric字段的值 或者 与字段相关的的某个特定的值的函数,来对文档进行评分。

    1.使用函数查询的方法

    这里主要有三种方法可以使用函数查询,这三种s方法都是通过solr http接口的。

    1)使用FunctionQParserPlugin。ie: q={!func}log(foo)

    2)使用“_val_”内嵌方法

    内嵌在正常的solr查询表达式中。即,将函数查询写在 q这个参数中,这时候,我们使用“_val_”将函数与其他的查询加以区别。

    ie:entryNm:make && _val_:ord(entryNm)

    3)使用dismax中的bf参数

    使用明确为函数查询的参数,比如说dismax中的bf(boost function)这个参数。  注意:bf这个参数是可以接受多个函数查询的,它们之间用空格隔开,它们还可以带上权重。所以,当我们使用bf这个参数的时候,我们必须保证单个函数中是没有空格出现的,不然程序有可能会以为是两个函数。

    示例:

    q=dismax&bf="ord(popularity)^0.5 recip(rord(price),1,1000,1000)^0.3

    2.函数的格式(Function Query Syntax)

    目前,function query 并不支持 a+b 这样的形式,我们得把它写成一个方法形式,这就是 sum(a,b).

    3.使用函数查询注意事项

    1)用于函数查询的field必须是被索引的;

    2)字段不可以是多值的(multi-value)

    4.可以利用的函数 (available function)

    1)constant:支持有小数点的常量; 例如:1.5 ;SolrQuerySyntax:_val_:1.5

    2)fieldvalue:这个函数将会返回numeric field的值,这个字段必须是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({!dismax v='solr rocks'}) 将会返回popularity和通过dismax 查询得到的分数的乘积。

    q=product(popularity, query($qq)&qq={!dismax}solr rocks 跟上一个例子的效果是一样的。不过这里使用的是引用的方式

    q=product(popularity, query($qq,0.1)&qq={!dismax}solr rocks 在前一个例子的基础上又加了一个默认值。

    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

    展开全文
  • Solr使用 配置安装 部署环境 系统环境:centos Jdk:1.7 Tomcat:7 Solr版本:5.2 部署solr服务器 1.下载solr-5.2 wget http://mirrors.hust.edu.cn/apache/lucene/solr/5.2.0/solr-5.2.0.tgz 2.解压solr-...

    Solr使用

    配置安装

    部署环境

    系统环境:centos

    Jdk:1.7

    Tomcat:7

    Solr版本:5.2

    部署solr服务器

    1.下载solr-5.2

    wget  http://mirrors.hust.edu.cn/apache/lucene/solr/5.2.0/solr-5.2.0.tgz

    2.解压solr-5.2.0.tgz

    tar zxvf solr-5.2.0.tgz

    3.在文件夹solr-5.2.0\server\webappssolr.war拷贝到tomcat

    cp solr-5.2.0/server/webapps/solr.war  apache-tomcat-7.0.67/webapps

    4.启动tomcat   war包部署完成

    sh apache-tomcat-7.0.67/bin/startup.sh

    5.部署完成后,将solr-5.2.0\server\lib\ext文件下的jar包拷贝,部署在tomcatsolrlib文件夹下

       cp solr-5.2.0/server/lib/ext/*  apache-tomcat-7.0.67/webapps/solr/WEB-INF/lib 

    6.新建文件夹solr_home(名字自己取),solr-5.2.0\server\solr文件夹的内容拷贝到solr_home

       mkdir solr_home

       cp -rf solr-5.2.0/server/solr/*  solr_home

    7.修改tomcat部署的solr中的web.xml(默认注释,需要打开)

    这里的<env-entry-value>中的值就是在第5步新建的solr_home地址

    vim apache-tomcat-7.0.67/webapps/solr/WEB-INF/web.xml

     

     

     

    我们打开它,并且找到这一行,放开注释,并且修改<env-entry-value>

     

       <env-entry>

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

           <env-entry-value>/home/xu/solr_home</env-entry-value>

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

    </env-entry>

     

    到最后运行localhost:端口/solr,如果出现此页面即配置成功

     

    solr中创建Core

     

    在第一次运行solr时,我们需要创建一个数据我们的core

     

    1.linux中执行命令

    mkdir solr_home/mysolr

    2.将示例的配置文件复制到我们创建的mysolr

    cp -R solr_home/configsets/basic_configs/conf/ solr_home/mysolr

    3.接下来我们就需要去管理界面添加core

    修改上面两项名称为mysolr,即我们第一步创建的文件夹名(第一步中创建的文件夹名字是什么这里就写什么)

     

     

    在下方英文提示中:告诉我们上面两个框中的文件夹必须在创建core之前存在,我们所创建的文件夹中有core的配置文件

    创建成功后会生成core.properties  与   data文件夹

    Core.properties中是这个coresolr的映射关系,还有配置文件的名称等。

    Data中存储了这个core中的索引等等。

    具体解释可以参考http://iamyida.iteye.com/blog/2211728

    导入数据库中的数据到Core

    我们需要导入两个jar包,一个solr导入相关的jar,一个数据库的驱动jar

    cp solr-5.2.0/dist/solr-dataimporthandler-5.2.0.jar apache-tomcat-7.0.67/webapps/solr/WEB-INF/lib

    cp 你的数据库驱动jar目录 apache-tomcat-7.0.67/webapps/solr/WEB-INF/lib

    (需要拷贝你所用的数据库的驱动包)

     

    solr-dataimporthandler-5.2.0.jar 把这个jar包拷贝到tomcat中,并重启tomcat

     

    默认dataImport功能在Solr5中是禁用的,需要在solrconfig.xml中添加如下配置开启数据导入功能:

    vim solr_home/mysolr/conf/solrconfig.xml

    添加如下

    <requestHandler name="/dataimport" 

    class="solr.DataImportHandler">  

              <lst name="defaults">  

                    <str name="config">data-config.xml</str>  

              </lst>  

        </requestHandler>  

     如上被我标红的data-config.xml 可以在示例中找到

    从示例中直接拷贝一份data-config.xml到我们创建的core

          cp solr-5.2.0/example/example-DIH/solr/db/conf/db-data-config.xml solr_home/mysolr/conf/data-config.xml

    data-config.xml稍作修改即可使用

    这里我是以mysql为例子使用的

     <dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://172.16.231.5:3306/db_inquiry_gldjc?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNul" user="root" password="root" />

     

    <document>

               <entity name="mobile" query="select id,bill_number,title,created_at from artificial_inquiry_bills">  

                <field column="id" name="id"/>  

                <field column="bill_number" name="billNumber"/>  

                <field column="title" name="title"/>  

                <field column="created_at" name="createdAt"/>  

             </entity>

     </document>

    documentSolr的信息的基本单位的是Document,它是一组描述某些事物的数据集合。

    FieldDocument的主要构成单元,是更具体的信息描述。

    然后我们需要在schema.xml中定义在data-config.xml中的field

    <field name="billNumber" type="string" indexed="true" stored="true"/>

    <field name="title" type="string" indexed="true" stored="true"/>

    <field name="createdAt" type="date" indexed="true" stored="true"/>

    Name:单元名   type:类型   indexed:是否索引  stored:是否储存

     

    一切准备工作做好后在管理页面

     

     

    按照步骤

    1.点击dataimport

    2.Command选择full-import   就是全部导入的意思

    3.Entity 选择你想导入的entity

    4.最后点击execute,即可导入

    导入成功即可看到如下页面

     

    展开全文
  • solr7.4教程 使用solr的完整流程

    万次阅读 多人点赞 2018-07-15 12:36:22
    所有我打算写一篇有完整使用流程的solr教程希望能让后面新接触solr的同学能更容易掌握它,另一方面也是对自己所学做一个梳理。由于本人水平有限如果有书写不对的地方还请多多指正,万分感谢。   本文摘要 一、...

           由于最近公司业务可能需要用到solr所以花了几天时间研究了一下,发现solr在网上的教程没有太好的入门文章,要么文章所写的solr版本太老,要么就是介绍的内容不够完整。所有我打算写一篇有完整使用流程的solr教程希望能让后面新接触solr的同学能更容易掌握它,另一方面也是对自己所学做一个梳理。由于本人水平有限如果有书写不对的地方还请多多指正,万分感谢。
     

    本文摘要

    一、下载与安装

    二、运行solr     

    三、创建core实例

    四、配置schema

    五、DIH导入数据

    六、solrJ(java客户端)

     

    本文所用到的工具

    Postman :简单说就是一个可以发送post请求的http客户端 这是官网地址https://www.getpostman.com/

    IKAnalyzer中文分词器 :一个第三方分词器,下载地址https://download.csdn.net/download/u010510107/10558538

     

    一、下载与安装:

    1.      下载:https://lucene.apache.org/solr/到官网点击Download下载。

    2.      下载完成后会得到一个压缩包,解压后会获得一个solr_7.4.0文件夹,此文件夹目录结构如下图

              

     

    二、运行solr

    Solr的运行分为单机运行和集群运行,这里以单机为例:

    1.      在bin目录下执行bin/solr start 此命令会启动solr应用服务器默认端口为8983,如果想指定端口号启动可以加参数–p例 如:solr start –p 8888.

    如图这句提示出现后证明服务启动成功(启动过程中如果打印java异常堆栈log4j2.xml 文件名、目录名或卷标语法不正确。没有关系不妨碍我们正常使用solr可以忽略此问题),接下来在浏览器输入http://localhost:8888/solr可以进入Admin UI界面验证是否启动成功如下图

    此界面是用来管理solr的,此时solr服务器已经可以启动成功啦下面介绍一下其他比较常用的solr命令。

    2. solr常用命令:

    solr start –p 端口号 单机版启动solr服务

    solr restart –p 端口号 重启solr服务

    solr stop –p 端口号关闭solr服务

    solr create –c name 创建一个core实例(core概念后面介绍)

    此外有关于solr集群版启动方式和其他更多的命令可以参看官方文档https://lucene.apache.org/solr/guide/7_4/solr-control-script-reference.html

     

    三、创建core实例:

    1.      core简介:简单说core就是solr的一个实例,一个solr服务下可以有多个core,每个core下都有自己的索引库和与之相应的配置文件,所以在操作solr创建索引之前要创建一个core,因为索引都存在core下面。

    2.      core创建:core的创建方式有很多种一下列出两种比较方便的。

    (1)      在bin目录下执行solr create –c name,创建一个core,默认创建出来的位置如下图

                    

     

    (2)      第二种方式是直接使用AdminUI页面创建一个core,如下图

                    

     

    四、  配置schema

    1.      schema简介:

           schema是用来告诉solr如何建立索引的,他的配置围绕着一个schema配置文件,这个配置文件决定着solr如何建立索引,每个字段的数据类型,分词方式等,老版本的schema配置文件的名字叫做schema.xml他的配置方式就是手工编辑,但是现在新版本的schema配置文件的名字叫做managed-schema,他的配置方式不再是用手工编辑而是使用schemaAPI来配置,官方给出的解释是使用schemaAPI修改managed-schema内容后不需要重新加载core或者重启solr更适合在生产环境下维护,如果使用手工编辑的方式更改配置不进行重加载core有可能会造成配置丢失,配置文件所在的路径如下图:

                    

     

    2.      schema主要成员:

    (1)      fieldType:为field定义类型,最主要作用是定义分词器,分词器决定着如何从文档中检索关键字。

    (2)      analyzer:他是fieldType下的子元素,这就是传说中的分词器,他由一组tokenizer和filter组成,如下图所示

    (3)      field:他是创建索引用的字段,如果想要这个字段生成索引需要配置他的indexed属性为true,stored属性为true表示存储该索引。如下图所示每个field都要引用一种fieldType由type属性定义

    这里描述的只是最常用的三个元素,关于更多schema的介绍请参考http://lucene.apache.org/solr/guide/7_4/documents-fields-and-schema-design.html

     

    3.      Schema API

    Schema API其实就是用post请求向solr服务器发送携带json参数的请求,所有操作内容都封装在json中,如果是linux系统直接使用curl工具,如果是windows系统推荐使用Postman

     

    这里以添加一个field为例,下面列出其他API

    add-field: add a new field with parameters youprovide.

    delete-field: delete a field.

    replace-field: replace an existing field withone that is differently configured.

    观看更多API内容请参考http://lucene.apache.org/solr/guide/7_4/schema-api.html

    4.中文分词器:

    solr自带了一些中文分词器,比较好用的是SmartChineseAnalyzer,但是扩展性比较差不能自定义扩展中文词库,所以这里选择使用IKAnalyzer,这是第三方的一个分词器可以很好的扩展中文词库,IKAnalyzer下载后解压会有如下文件

     

    把核心jar文件复制到solr WEB应用的lib文件夹下,如下图

     

    把配置文件和词库等文件复制到WEB应用的classes文件夹下,如果子WEB-INF下没有这个文件夹自己创建即可,如下图:

     

    如果想要扩展词库可以在ext.dic文件中配置自定义的中文词组,例如:诛仙这个词组,这个分词器的算法是算不出来的但是通过我们自定义词库,分词器也可以把诛仙列出关键词。

        上图是ext.dic文件中的内容,注意编辑此文件时字符编码最好是UTF-8无BOM模式,这个可以通过EditPlus等文本编辑工具设置。下面开始在Schema中应用分词器如下图:

     

     

     

    定义了一个text_ik这个字段类型并采用Ik分词器,接下来在field元素定义式指定type=text_ik就可以把这个分词器应用在这个field中。

    接下来我们来验证下ik分词器,如下图:

     

    五、DIH导入索引数据

    1.      DIH简介:

    DIH全称是Data Import Handler 数据导入处理器,顾名思义这是向solr中导入数据的,我们的solr目的就是为了能让我们的应用程序更快的查询出用户想要的数据,而数据存储在应用中的各种地方入xml、pdf、关系数据库中,那么solr首先就要能够获取这些数据并在这些数据中建立索引来达成快速搜索的目的,这里就列举我们最常用的从关系型数据库中向solr导入索引数据。

    2.      在我们自己建立的core的目录下有conf目录,这里面有着几个很重要的配置文件,之前我们用到的managed-schema(老版本是schema.xml)也在其中,另外还有一个solrconfig.xml文件,这是我们DIH配置的第一步,需要在此文件中配置数据导入文件的映射位置如下图:

     

    第二步配置数据导入文件,这个文件可以在solr根目录下的示例文件中copy一份到core/conf目录下,也就是跟solrconfig.xml在一个目录下,因为solrconfig.xml中配置的相对路径就是这里,当然也可以写绝对路径。如下图:

     

    Copy过去之后这个文件名可以自定义,我就改成了MyDataConfig.xml,下面开始配置如下图:

     

    (1)首先配置数据源关系型数据库基本四项,驱动类,url,用户名,密码。

    (2)配置document,可以把它当作与mysql中数据库一个层级的对象。

    (3)配置entity,可以把它当作与数据库中一个表对应,在query中书写查询sql。

    (4)配置field与表中的字段与之对应。

            注意这里容易与schema中的配置混淆,我的理解是schema中配置的是创建索引的配置,而索引的创建需要有数据基础,而现在讲的数据导入文件就是建立索引的数据基础,他是创建索引的元数据。现在配置文件完成后可以用DIH命令执行了。

    3.      DIH 命令

    DIH命令就是用来执行数据导入的,命令种类繁多这里只列出简单常用。DIH命令采用的方式是URL的方式。

    full-import:全部数据导入例如:

     

    接下来验证下数据是否真的导入成功了,如下图

     

    fq:过滤的字段,df:默认查询字段,start,rows:分页配置,sort:排序,更多关于查询语句的介绍请参考http://lucene.apache.org/solr/guide/7_4/searching.html

    六、solrJ(java客户端)

    简介:solrJ是java访问solr的客户端工具包,solr也提供了其他语言访问的客户端,可以到官方文档查看,现在solr的索引和数据导入都已经有,但是作为项目中应用的一个组件,少不了java与solr的沟通。

    1.      导入solrJ依赖

    如果你是用的是依赖管理工具如maven那么很简单直接添加依赖。

    <dependency>

     <groupId>org.apache.solr</groupId>

     <artifactId>solr-solrj</artifactId>

     <version>7.4.0</version>

    </dependency>

    2.从solr中查询索引

     

    3. 向solr添加更改索引

     

    (1)java实体对象与solr索引映射

    (2)向solr添加或更新索引,如果此实体在solr索引库中已有则作为更新操作

    文章写到这里solr的基本使用就都介绍完了感谢大家的观看。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 环境本教程使用solr 4.9,需要。。。1. Java 1.7或者更高。 2. 下载solr,地址。开始解压solr压缩包,并且进入到“example”文件夹中。Solr可以在很多Java容器中运行,本教程使用jetty。运行example文件夹中的start....

    预览

    本文档简要介绍如何运行solr,如何进行数据操作。

    环境

    本教程使用solr 4.9,需要。。。

    1. Java 1.7或者更高。 2. 下载solr,地址。

    开始

    解压solr压缩包,并且进入到“example”文件夹中。

    Solr可以在很多Java容器中运行,本教程使用jetty。

    运行example文件夹中的start.jar,java -jar start.jar,就可以使用jetty运行solr的war包,配置文件使用的是example中的configs。

    上面的命令会启动jetty服务器,端口默认是8983,并且会将日志打印到控制台。

    可以通过http://localhost:8983/solr/来打开solr的管理员页面。

    数据索引

    Solr服务器已经起开了,但是没有任何数据。我们可以通过post命令来向其中add(update、delete、pending adds and deletes)文档来修改solr的索引。实现的方式详情。

    exampledocs目录中包含了一些样例文件,这些文档可以通过命令post到solr中。在此我们使用java -jar post.jar -h这种方式。

    java -jar post.jar solr.xml monitor.xml

    我们可以将所有的xml文档都添加到Solr中,java -jar post.jar *.xml。

    还有很多种方式将数据导入到Solr中:

    + 通过Data Import Handler(DIH)从数据库中导入数据 + 加载CSV文件(文件中的数据用逗号分隔),csv文件可以是Excel和Mysql导出的。 + Post json文档+ 通过Solr Cell索引二进制文档,如word或者pdf。 + 通过java或者solr支持的其他语言,用程序创建并导入到solr中。

    Update数据

    我们注意到即使solr.xml这个文档被导入了两次,但是我们在搜索solr关键字时,仍旧得到一个结果。这是因为每个文档都有一个唯一性的字段”id”。向solr中添加文档时,如果id相同,solr就会更新这篇文档。我们可以通过http://localhost:8983/solr/#/collection1/plugins/core?entry=searcher这个页面中的numDocs和maxDoc来验证。

    numDocs代表索引中的document的数目(这个数目可能比solr中xml文件的数目大,因为单个xml文件可能包含多个document)。numDocs可能比maxDocs还要大,因为某些文档可能被删除了,但是索引还没有更新。即使我们多次post同一份xml文件,numDocs也不会增加,因为id相同,solr做的是update动作。

    编辑这些xml文件,修改其中的内容,然后重新运行java -jar post.jar命令,再进行搜索,我们就可以看到刚才修改的内容。

    Delete数据

    我们可以向solr post删除命令,如果指定了id就是删除某篇document;如果这个命令中的query可以匹配多个document,那就删除多个document(小心)。下面的命令会删除指定的document。

    java -Ddata=args -Dcommit=false -jar post.jar "SP2514N"

    上面的命令,我们指定了commit=false,所以我们还可能会检索到刚刚删除的document,因为索引还没有更新。

    通过statistics page这个updateHandler页面,我们可以看到删除document生效的过程,deletesById这个值降为0,cumulative_deletesById和autocommit这两个增加。

    下面是使用query批量删除document的示例。

    java -Dcommit=false -Ddata=args -jar post.jar "name:DDR"

    如果我们想让之前的变化立即生效,我们可以通过命令强制solr使用新的searcher:

    Java -jar post.jar -

    现在,再次执行之前的query,可以发现已经删除的document,不会再被搜索出来了。我们可以再次通过statistics page来看updateHandlercommit的个数,和searcher中的numDocs。

    使用新的searcher,可能会花费很高的代价(时间、内存等),所以最好是积攒很多changes,然后批量提交给solr,再让solr重建索引。还有一个命令optimize,它和commit命令完成同样的操作,但是它会强制所有的索引分片都merge到同一个分片中,这样很耗费资源,但能提高检索速度,如果你的索引不经常变化,可以试试。

    所有的update命令,都可以使用xml和json两个格式。

    为了下面的教程,再把exampledocs文件夹中的xml文件,post到solr中。

    java -jar post.jar *.xml

    query数据

    在前台,我们通过http get请求获取solr的索引的内容,参数q可以指定一些条件。我们可以指定一些可选的参数给request handler,来控制返回的内容。比如,我们可以使用”fl”这个参数来控制返回的字段。

    排序

    Solr中可以对一个或者多个字段进行排序。我们可以在get请求中的”sort”参数中具体指定排序规则。

    q=video&sort=price_desc 按价格降序

    q=video&sort=price_asc 按价格升序

    q=video&sort=inStock asc, price desc 首先按instock升序,然后按价格降序。

    “Score”这个字段也可以用来排序:

    还可以使用一些复杂的函数:

    q=video&sort=div(popularity,add(price,1)) desc

    如果没有指定排序规则,结果默认按score降序排序。

    高亮

    Hit highlighting returns relevant snippets of each returned document, and highlights terms from the query within those context snippets.

    下面的例子,搜索关键词video card,并且高亮name和features字段。这样solr在返回的数据中,会将name和features字段包含在标签里面,产生高亮效果。更多关于高亮的信息,点击此处。

    Faceted Search(分面搜索,也有翻译成垂直搜索的)

    faceted search检索出符合query的document,并且把document按照不同的属性或者策略进行计数。这种搜索常用于在检索结果中再进行分配检索。

    ...&q=*:*&facet=true&facet.field=cat

    上面返回10条document,这10条数据是根据我们的query分面(垂直)搜索出来的。

    我们也可以同时指定多种条件,如下面添加了inStock这个条件:

    ...&q=*:*&facet=true&facet.field=cat&facet.field=inStock

    Solr也支持区间条件查询。下面的例子,指定了price的区间。

    ...&q=ipod&facet=true&facet.query=price:[0 TO 100]&facet.query=price:[100 TO *]

    Solr甚至可以通过数值范围(包括日期)进行分面。下面的例子,计算从Document中,2004和2010年每年的制造日期(manufacturedate_dt字段)

    ...&q=*:*&facet=true&facet.range=manufacturedate_dt&facet.range.start=2004-01-01T00:00:00Z&facet.range.end=2010-01-01T00:00:00Z&facet.range.gap=+1YEAR

    展开全文
  • 前言搭建好了solr服务器,使用solr自带的数据导入是不现实的,我们需要在java代码中实现solr对数据的导入。导入jar包引入solr-solrj.jar(solr-4.10.3的dist目录下)操作数据1、添加数据public void addDocument() ...
  • 一、安装1.1 安装jdksolr是基于lucene而lucene是java写的,所以solr需要jdk----当前安装的solr-7.5需要jdk-1.8及以上版本,下载安装jdk并设置JAVA_HOME即可。1.2 安装solr下载solr,然后解压即可,windows和linux都...
  • news.setRelatedLinks(genLinks());//SolrInputDocument doc1 = binder.toSolrInputDocument(news);...}try {HttpSolrServer server = new HttpSolrServer(SOLR_URL);server.setRequestWriter(new Binar...
  • Apache Solr支持不同格式,例如数据库...使用 Apache Zookeeper针对高流量进行优化。Solr功能先进的全文搜索功能。XML,JSON和HTTP - 基于开放接口标准。高度可扩展和容错。同时支持模式和无模式配置。分页搜索和过滤...
  • Solr安装使用教程

    2018-10-17 17:07:00
    solr是基于lucene而lucene是java写的,所以solr需要jdk----当前安装的solr-7.5需要jdk-1.8及以上版本,下载安装jdk并设置JAVA_HOME即可。 jdk下载地址:...
  • solr入门使用教程

    2017-05-02 11:24:18
    本文将描述如何初步使用solr。至于安装、部署大家可以自行Google或者参考这里:solr环境搭建。 SolrJ小例子 一、:启动配置好的solr Tomcat,IDEA新建MAVEN项目,添加依赖: 二、新建创建索引类: ...
  • solr7.4教程

    2018-12-12 16:50:47
    所有我打算写一篇有完整使用流程的solr教程希望能让后面新接触solr的同学能更容易掌握它,另一方面也是对自己所学做一个梳理。由于本人水平有限如果有书写不对的地方还请多多指正,万分感谢。 本文摘要## 一、下载与...
  • solr 7.4.0使用教程

    2018-09-02 14:42:54
    二、运行solr  三、创建core实例 四、配置schema 五、DIH导入数据 六、solrJ(java客户端)   本文所用到的工具 Postman :简单说就是一个可以发送post请求的http客户端 这是官网地址...
  • solr入门教程

    2019-12-02 16:03:13
    第一节:下载solr 第二节:解压、启动、访问solr 第三节:使用命令添加/删除 core 第四节:core相关配置文件简介及操作 第五节:IK分词器 第六节:从数据库导入数据到solr 第七节:使用solrj操作solr
  • Apache Solr入门教程

    2019-09-26 04:05:42
    Apache Solr入门教程(初学者之旅) 写在前面:本文涉及solr入门的各方面,请逐行阅读,相信能帮助你对solr有个...此外,我们将告诉你如何进行使用solr的样本数据文件索引。Apache Solr支持不同格式,包括各种数据...
  • solr完整教程

    千次阅读 2015-01-21 17:17:52
    Solr使用Lucene并且进行了扩展Schema模式查询核心缓存复制管理接口 Solr服务原理  索引 搜索 源码结构 目录结构说明Solr home说明solr的各包的说明 版本说明  版本版本 分布式和复制 Solr 架构 ...
  • 1 solr的下载 从Solr官方网站(http://lucene.apache.org/solr/)下载Solr最新版本,根据Solr的运行环境,Linux下需要... Solr使用指南可参考:https://wiki.apache.org/solr/FrontPage。 本教程中我使用的是sol...
  • solr4.10.3使用教程

    2017-01-11 16:23:00
    1、下载tomcat ... 2、下载solr http://lucene.apache.org/solr/ 3、解压tomcat与solr ...4、拷贝:solr-4.10.3\example\webapps\solr.war 到 apache-tomcat-7.0.52\webapps\目录中 直接解压 solr.war 或者...
  • Solr初级教程

    2015-11-29 16:17:10
    预览  本文档简要介绍如何运行solr,... 环境 本教程使用solr 4.9,需要。。。 1. Java 1.7或者更高。 2. 下载solr,地址。 开始 解压solr压缩包,并且进入到“example”文件夹中。 目录[-] 预览
  • solr安装教程

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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 499
精华内容 199
关键字:

solr使用教程