solr
Posted lhang55
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了solr相关的知识,希望对你有一定的参考价值。
1.智能提示
查询条件:resource表字段
下拉框
组合查询(高级搜索):不同查询条件
单个字段作为条件
整体查询(简单搜索):一个搜索框
所有字段作为条件
返回页面:
资源名称,摘要,
Solr
jar版本不一致
solr官方文档 浏览方法
翻译成中文先大致浏览
再详细观看
1.基于标准的开放接口:Solr支持XML,JSON和HTTP的调用形式,所以虽然solr是用java写成,但是我们依然可以使用别的语言来调用solr
2.先进的全文检索技术:在Solr中,我们不仅可以使用词来作为检索条件,还可以使用时间范围,数字范围等作为检索条件,也可以进行模糊搜索。
3.线性可扩展性:可以在线的扩展索引节点,自动索引复制,自动故障切换和恢复。
4.近实时索引:数据添加到索引后,可以很快的被检索到。
5.管理界面:可以很方便的管理各个节点,包括索引统计信息以及各个节点的状态。
core集合、核心
单机版要创建core,分布式要创建collection。
core是solr的索引库,可以看做一个数据库。
-n指定配置集合。Solr默认提供了3个配置集合。这里我们使用的是schemaless,意思是可以提供任意名字的任意列,类型将会被猜测
solr.xml solr的主要配置文件,在solr启动的时候被加载,solr的配置信息包括端口号,连接时间,超时时间等.
schema.xml 该文件是索引的schema,包含了域类型的定义.
solrconfig.xml 该文件是Solr的主配置文件,solr的版本,数据存放位置,定义扩展功能的使用等.
Solr的配置主要是以下三个主要的文件solr.xml, solrconfig.xml, schema.xml,在solr启动的时候,会首先检查solr.xml,这个文件是solr的全局的配置信息.告诉solr在哪里可以找到solr的实例.在solr.xml加载后,solr会去每个实例内查找solrconfig.xml. solrconfig.xml指向其他的配置文件.除非修改solrconfig.xml,否则将以schema.xml配置文件来决定Solr的字段
集成solr系统
1.业务数据组织形式
一个或者多个核心
多core查询的要求是,两份索引里面的主键字段,和查询数据字段必须一致,就是说都必须有一样的字段名,否则查询的时候或者归并merge的时候会报错,其实这正是分布式搜索的基础条件,只不过现在我们不用solrcloud也能查询多个core,需要注意前提条件: 主键字段+查询字段的名称必须一致
- HttpSolrClient sc=new HttpSolrClient("http://192.168.1.215:8983/solr/a");
- String shards = "192.168.1.215:8983/solr/a,192.168.1.214:8983/solr/b";
- ModifiableSolrParams solrParams = new ModifiableSolrParams();
- solrParams.set("q", "sname:北京奇虎科技有限公司");
- // solrParams.set("q.op", "AND");//设置查询关系
- solrParams.set("fl", "*,score");//设置过滤
- solrParams.set("shards", shards);//设置shard
- QueryResponse rsp = sc.query(solrParams);
- System.out.println("命中数量:"+rsp.getResults().getNumFound());
- for(SolrDocument sd:rsp.getResults()){
- System.out.println(sd);
- }
- sc.close();
不同数据的关联关系如何管理
document级别
field级别 copyField 拷贝字段
拷贝字段举例来说,就是查询的时候不用再输入:userName:张三 and userProfile:张三的个人简介。直接可以输入"张三"就可以将“名字”含“张三”或者“简介”中含“张三”的又或者“名字”和“简介”都含有“张三”的查询出来。他将需要查询的内容放在了一个字段中,并且查询该字段就行了
如建立了一个统一的查询字段all,并将name和summary拷贝到这个字段内:
< field name="all" type="text" indexed="true" stored="false" multiValued="true" />
并在拷贝字段结点处完成拷贝设置:
<copyField source="name" dest="all"/>
<copyField source="summary" dest="all" maxChars="300"/>
2.与数据库的连接
solrconfig.xml配置
或者solrconfig.xml添加插件进行配置
<requestHandler name="/dataImport" class="solr.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
3.数据库更改信息获知
Solr索引可以接受来自许多不同来源的数据,包括XML文件,逗号分隔值(CSV)文件,从数据库表格中提取的数据以及常用文件格式(如Microsoft Word或PDF)中的文件
以下是将数据加载到Solr索引中的三种最常用的方法:
(1)使用基于Apache Tika构建的Solr Cell框架来获取二进制文件或结构化文件,如Office,Word,PDF和其他专有格式。
(2)通过发送HTTP请求到任何可以生成这些请求的环境中的Solr服务器来上传XML文件。
(3)编写自定义Java应用程序以通过Solr的Java客户端API(在客户端API中更详细地描述)获取数据。如果您正在使用提供Java API的应用程序(如内容管理系统(CMS)),那么使用Java API可能是最佳选择。
4.手动更新索引 、实时更新索引
(1)全量导入和增量导入
solr索引设置完成后,需要根据数据库的变化及时更新索引,索引的更新有两种方式
全量导入
删除solr服务器上的所有索引,然后重新导入数据
增量导入
只更新修改的数据,可能是修改添加的数据
主要原理是用每次进行import的时候在solr.homeconf下生成的dataimport.properties文件,此文件里面有最近一次导入的相关信息。
last_index_time是最近一次索引(full-import或delta-import)的时间。通过比较这个时间和数据库表中的timestamp列即可得出哪些是之后修改或添加的
managed-schema
name:域名
type:域的类型,必须匹配类型,不然会报错
indexed:是否要作索引
stored:是否要存储
required:是否必填,一般只有id才会设置
multiValued:是否有多个值,如果设置为多值,里面的值就采用数组的方式来存储,比如商品图片地址(大图,中图,小图等)
<field name="ename" type="string" indexed="true" stored="true"/>
<field name="job" type="string" indexed="true" stored="true"/>
<field name="mgr" type="pint" indexed="true" stored="true"/>
动态域 dynamicField
<dynamicField name="*_i" type="string" indexed="true" stored="true" multiValued="true" />
何谓动态域呢?就是这个域的名称,是由表达式组成的,只要名称满足了这个 表达式,就可以用这个域
同样的认识一下这些属性
name:域的名称,该域的名称是通过一个表达式来指定的,只要符合这这个规则,就可以使用这个域。比如 aa_i,bb_i,13_i等等,只要满足这个表达式皆可
复制域 copyField
<copyField source="cat" dest="text"/>
说明一下相应的属性
source:源域
dest:目标域
复制域,将源域的内容复制到目标域中
注意:目标域必须是允许多值的,如下,multiValued必须为true,因为可能多个源域对应一个目标域,所以它需要以数组来存储
<field name="text" type="string" indexed="true" stored="true" multiValued="true"/>
solr默认是没有开启dataimport这个功能的,所以我们要经过一点配置来开启它
1.首先找到solr5.5/dist/solr-dataimporthandler-5.5.2.jar,把这个文件复制到tomcat/webapp/solr/WEB-INF/lib/下,并且找到相应数据库的驱动包,也同样放到该目录。我这里用的是mysql的驱动包。
2.找到solr5.5/example/example-DIH/solr/db/conf/db-data-config.xml,把其复制到solrHome/core1/conf/下,并改名为data-config.xml.
3.找到solrHome/core1/conf/solrconfig.xml,并打开,在里面添加一段内容,如下
4.solrconfig.xml
<requestHandler name="/dataImport" class="solr.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
5.打开并编辑data-config.xml,完整的配置文件如下
6.data-config.xml
一个Solr文档可以被认为是一个非规范化的模式,其字段的值来自多个表。
data-config.xml首先定义一个文档元素。一个文件代表一种文件。一个文档包含一个或多个根实体。根实体可以包含多个子实体,这些子实体又可以包含其他实体。实体是关系数据库中的表/视图。每个实体可以包含多个字段。每个字段对应于实体中查询返回的结果集中的一列。对于每个字段,请在结果集中提及列名称。如果列名与solr字段名不同,则应给出另一个属性名称。其他所需的属性如类型将直接从Solr schema.xml推断出来。(可以被覆盖)
为了从数据库获取数据,我们的设计理念围绕用户为每个实体输入的“模板化sql”进行。如果需要的话,这可以为用户提供SQL的全部功能。根实体是中央表,其列可用于将此表与其他子实体连接起来
<dataConfig>
<dataSource driver="oracle.jdbc.driver.OracleDriver"
type="JdbcDataSource"
url="jdbc:oracle:thin:@localhost:1521:tst"
user="demo"
password="123456"/>
<document>
<!-- name属性,就代表着一个文档,可以随便命名 -->
<!-- query是一条sql,代表在数据库查找出来的数据 -->
<entity name="Blog" transformer="ClobTransformer"<!-- clob大字段 --> pk="id" query="select * from Blog">
<!-- column的EMPNO是数据库的id,name的id是managed_schema里面的id,id是必须,并且唯一的 -->
<!-- 每一个field映射着数据库中列与文档中的域,column是数据库列,name是solr的域(必须是在managed-schema文件中配置过 的域才行) -->
<!-- 当数据库中column名字与solr的schema的字段名字不一致时,数据库字段名字区分大小写-->
<field column="id" name="id"/>
<field column="url" name="url"/>
<field column="title" name="title"/>
<field column="content" name="content"/>
<field column="remark" name="remark"/>
<field column="BIGCONTENT" name="bigcontent" clob="true"/>
<!-- ClOB 字段的 column 必须大写!! clob设置为true-->
</entity>
</document>
</dataConfig>
(2)增量导入注意事项
增量导入时切记将clean参数设为false,否则将删除以前的索引
solrj编写add程序,打包成jar包发布
bin / post工具是Unix shell脚本, 一个简单的命令行工具,用于将各种类型的内容发布到Solr服务器
索引XML
将文件扩展名的所有文档添加.xml到名为collection或core的文件中gettingstarted。
bin/post -c gettingstarted *.xml
索引CSV
将所有CSV文件索引到gettingstarted:
bin/post -c gettingstarted *.csv
将制表符分隔的文件索引到gettingstarted:
bin/post -c signals -params "separator=%09" -type text/csv data.tsv
索引JSON
将所有JSON文件编入索引gettingstarted。
bin/post -c gettingstarted *.json
索引丰富的文档(PDF,Word,html等)
将PDF文件索引到gettingstarted。
bin/post -c gettingstarted a.pdf
索引处理程序是请求处理程序,用于向索引添加,删除和更新文档。除了使用Tika导入丰富文档的插件或使用数据导入处理程序的结构化数据源之外,Solr本身还支持以XML,CSV和JSON索引结构化文档
许多搜索应用程序将要编入索引的内容存储在结构化数据存储中,例如关系数据库。数据导入处理程序(DIH)提供了一种从数据存储中导入内容并将其编入索引的机制。
除关系数据库外,DIH还可以从基于HTTP的数据源(例如RSS和ATOM订阅源),电子邮件存储库以及使用XPath处理器生成字段的结构化XML中索引内容
5.身份认证
在独立模式下运行Solr时,需要创建该security.json文件并将其放入$SOLR_HOME的安装目录中(这与solr.xml通常所在的位置相同server/solr)。
如果正在使用Legacy Scaling and Distribution,则需要放置security.json在群集的每个节点上。
可以使用身份验证和授权API,但是如果使用的是传统缩放模型,则需要分别在每个节点上创建相同的API请求。security.json也可以手动编辑。
验证插件通过验证传入请求来帮助保护Solr的端点。自定义插件可以通过扩展AuthenticationPlugin类来实现。
认证插件由两部分组成:
1.服务器端组件,它使用插件中定义的机制(例如Kerberos,基本身份验证或其他)来拦截和验证对Solr的传入请求。
2.客户端组件,即一个扩展HttpClientConfigurer,它使SolrJ客户端能够使用服务器可以理解的认证机制向安全Solr实例发出请求
可用的身份验证插件
Solr具有以下认证插件的实现:
(1)Kerberos身份验证插件
(2)基本身份验证插件
(3)Hadoop身份验证插件
.搜索
(1)模糊查询
当用户在Solr中运行搜索时,搜索查询由请求处理程序处理。请求处理程序是Solr插件,用于定义在Solr处理请求时要使用的逻辑。Solr支持各种请求处理程序。有些是为处理搜索查询而设计的,而另一些则用于管理索引复制等任务。
为了处理搜索查询,请求处理程序调用查询解析器,该解析器解释查询的术语和参数。不同的查询解析器支持不同的语法。Solr的默认查询解析器称为标准查询解析器,或者更常见的仅仅是“lucene”查询解析器。Solr还包括DisMax查询解析器和Extended DisMax(eDisMax)查询解析器。该标准查询分析器的语法允许在搜索中获得更高的精度,但DisMax查询分析器更容忍错误。DisMax查询分析器旨在提供类似于流行的搜索引擎(如Google)的体验,这些搜索引擎很少向用户显示语法错误。扩展DisMax查询解析器是DisMax的改进版本,它处理完整的Lucene查询语法,同时仍然容忍语法错误。它还包含几个附加功能。
另外,所有查询解析器都可以接受通用的查询参数。
搜索参数也可以指定过滤器查询。作为搜索响应的一部分,过滤器查询会针对整个索引运行查询并缓存结果。由于Solr为过滤器查询分配了单独的缓存,所以过滤器查询的策略性使用可以提高搜索性能。(尽管名称相似,但查询过滤器与分析过滤器无关。过滤器查询在搜索时对索引中已有的数据执行查询,而分析过滤器(如Tokenizers)根据指定的规则解析用于索引的内容。
搜索查询可以请求在搜索响应中突出显示某些术语; 也就是说,选定的条款将显示在彩色框中,以便它们在搜索结果的屏幕上“跳出来”。突出显示可以使查找中返回的长文档中的相关段落更容易找到。Solr支持多项高亮。Solr包含一组丰富的搜索参数,用于控制术语突出显示的方式。
搜索响应也可以配置为包含以突出显示的文本为特色的摘录(文档摘录)。流行的搜索引擎,如Google和Yahoo! 在他们的搜索结果中返回片段:3-4行文字提供搜索结果的描述。
标准查询解析器
DisMax查询解析器
扩展的DisMax查询解析器
其他解析器
q - 查询字符串,如果查询所有*:* (id:1)
fq - (filter query)过虑查询,过滤条件,基于查询出来的结果
fl - 指定返回那些字段内容,用逗号或空格分隔多个。
df -默认搜索的域
start - 分页开始
rows - 分页查询数据
sort - 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:(score desc, price asc)表示先 “score” 降序, 再 “price” 升序,默认是相关性降序。
wt - (writer type)指定输出格式,可以有 xml, json, php, phps。
fl表示索引显示那些field( *表示所有field,如果想查询指定字段用逗号或空格隔开(如:Name,SKU,ShortDescription或Name SKU ShortDescription【注:字段是严格区分大小写的】))
q.op 表示q 中 查询语句的 各条件的逻辑操作 AND(与) OR(或)
hl 是否高亮 ,如hl=true
hl.fl 高亮field ,hl.fl=Name,SKU
hl.snippets :默认是1,这里设置为3个片段
hl.simple.pre 高亮前面的格式
hl.simple.post 高亮后面的格式
//======高亮设置===
//开启高亮
query.setHighlight(true);
//高亮域
query.addHighlightField("product_name");
//前缀
query.setHighlightSimplePre("<span style=‘color:red‘>");
//后缀
query.setHighlightSimplePost("</span>");
facet 是否启动统计
facet.field 统计field
1. “:” 指定字段查指定值,如返回所有值*:*
2. “?” 表示单个任意字符的通配
3. “*” 表示多个任意字符的通配(不能在检索的项开始使用*或者?符号)
4. “~” 表示模糊检索,如检索拼写类似于”roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回相似度在0.8以上的记录。
5. 邻近检索,如检索相隔10个单词的”apache”和”jakarta”,”jakarta apache”~10
6. “^” 控制相关度检索,如检索jakarta apache,同时希望去让”jakarta”的相关度更加好,那么在其后加上”^”符号和增量值,即jakarta^4 apache
7. 布尔操作符AND、||
8. 布尔操作符OR、&&
9. 布尔操作符NOT、!、- (排除操作符不能单独与项使用构成查询)
10. “+” 存在操作符,要求符号”+”后的项必须在文档相应的域中存在
11. ( ) 用于构成子查询
12. [] 包含范围检索,如检索某时间段记录,包含头尾,date:[200707 TO 200710]
查询参数
1. CoreQueryParam查询的参数
1) q: 查询字符串,必须的。默认的排序是score desc,按积分降序排序。
2) q.op: 覆盖schema.xml的defaultOperator(有空格时用"AND"还是用"OR"操作逻辑),一般默认指定。
3) df: 默认的查询字段,一般默认指定。
4) qt: query type,指定查询使用的QueryHandler,默认为“standard”。
5) wt: writer type。指定查询输出结构格式,默认为“xml”。在solrconfig.xml中定义了查询输出格式:xml、json、python、ruby、php、phps、custom。
6) echoHandler:是否在查询结果中显示使用的QueryHandler名称。
7) echoParams:是否显示查询参数。none:不显示;explicit:只显示查询参数;all:所有,包括在solrconfig.xml定义的Query Handler参数。
8) indent - 返回的结果是否缩进,默认关闭,用indent=true|on 开启,一般调试json,php,phps,ruby输出才有必要用这个参数。
9) version - 查询语法的版本,建议不使用它,由服务器指定默认值。
2.CommonQueryParameters查询的参数
1) sort:排序,格式:sort=<field name>+<desc|asc>[,<fieldname>+<desc|asc>]? 。示例:(inStock desc, priceasc)表示先 “inStock” 降序, 再 “price” 升序,默认是相关性降序。。
2) start:用于分页定义结果起始记录数,默认为0,从第1条记录开始。
3) rows:用于分页定义结果每页返回记录数,默认为10。
4) fq:filterquery。使用Filter Query可以充分利用FilterQuery Cache,提高检索性能。作用:在q查询符合结果中同时是fq查询符合的,例如:q=mm&fq=date_time:[20081001TO 20091031],找关键字mm,并且date_time是20081001到20091031之间的。(fq查询字段后面的冒号和关键字必须有)
5) fl:field list。指定返回结果字段。以空格“ ”或逗号“,”分隔。默认为"*",指所有的字段。"socre"指还应返回记分。例如*,score将返回所有字段及得分。用solrj的bean时,需要在query中指定query.set("fl","*,score");
6) debugQuery:设置返回结果是否显示Debug信息。
7) explainOther:设置当debugQuery=true时,显示其他的查询说明。
8) defType:设置查询解析器名称。
9) timeAllowed:设置查询超时时间。
10) omitHeader:设置是否忽略查询结果返回头信息,默认为“false”。
二. 查询语法
1. 匹配所有文档:*:*
2. 强制、阻止和可选查询:
1) Mandatory:查询结果中必须包括的(for example, only entry name containing theword make)Solr/LuceneStatement:+make, +make +up ,+make +up +kiss
2) prohibited:(for example, alldocuments except those with word believe)
Solr/LuceneStatement:+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. 子表达式查询(子查询):可以使用“()”构造子查询。
For ex:(make AND up) OR (french AND Kiss)
5. 子表达式查询中阻止查询的限制:For ex:make (-up):只能取得make的查询结果;要使用make (-up *:*)查询make或者不包括up的结果。
6. 多字段fields查询:通过字段名加上分号的方式(fieldName:query)来进行查询
For ex:entryNm:make AND entryId:3cdc86e8e0fb4da8ab17caed42f6760c
7. 通配符查询(wildCard Query):
1) 通配符?和*:“*”表示匹配任意字符;“?”表示匹配出现的位置。
For ex: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) 一般模糊查询:for ex:make-believ~
2) 门槛模糊查询:对模糊查询可以设置查询门槛,门槛是0~1之间的数值,门槛越高表面相似度越高。For ex:make-believ~0.5、make-believ~0.8、make-believ~0.9
9. 范围查询(RangeQuery):Lucene支持对数字、日期甚至文本的范围查询。结束的范围可以使用“*”通配符。
For ex:
1) 日期范围(ISO-8601 时间GMT):sa_type:2AND 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, andMILLI (synonymous with MILLISECOND)可以被标志成日期。
For ex:
1) r_event_date:[* TO NOW-2YEAR]:2年前的现在这个时间
2)r_event_date:[* TO NOW/DAY-2YEAR]:2年前前一天的这个时间
(2)自动补全
简单可以利用一个字段来做查询,返回一些名词
6.spring-data-solr
3)Hadoop身份验证插件
以上是关于solr的主要内容,如果未能解决你的问题,请参考以下文章
大明聊SolrSolr查询语言 JSON Request API