solr联合多个字段进行检索(multivalued和copyfield的使用)
在实际工作中不仅仅对索引中的单个字段进行搜索。需要进行综合查询。 比如book表中有id,name(标题),price,summary(摘要),content(内容),我们要找一本书的时候,查询关键字“平凡的世界”,需要从标题或者摘要或者内容里包含这个关键字时就算找到了。这就需要使用copyField和multiValue标签了。
在schema.xml中将需要检索的字段,使用copyField拷贝到一个新的searchText的field中,并设置这个searchText field的multivalue属性为true即可。
<fields>
<field name="id" type="string" indexed="true" stored="true" required="true" />
<field name="name" type="textMaxWord_cn" indexed="true" stored="true" />
<field name="price" type="long" indexed="true" stored="true" />
<field name="summary" type="textMaxWord_cn" indexed="true" stored="true" />
<field name="content" type="textMaxWord_cn" indexed="true" stored="true" />
<field name="searchText" type="textMaxWord_cn" indexed="true" stored="false" multiValued="true" />
<field name="createTime" type="string" indexed="true" stored="false" />
</fields>
<uniqueKey>id</uniqueKey>
<defaultSearchField>searchText</defaultSearchField>
<solrQueryParser defaultOperator="AND" />
<copyField source="name" dest="searchText" />
<copyField source="summary" dest="searchText" />
且可设置检索的时候,哪个field占的权重多一点。 在solrconfig.xml中可设置如下:
<requestHandler name="dismax" class="solr.SearchHandler">
<lst name="defaults">
<str name="defType">edismax</str>
<str name="echoParams">explicit</str>
<float name="tie">0.1</float>
<!--
<str name="bf">scoreParser(type)</str>
-->
<str name="bf">sum(recip(ms(NOW,last_modified),3.16e-11,1,1),div(1000,price))^100</str>
<str name="pf">
name^100 summary^50 content^20
</str>
<str name="qf">
name^10 summary^ content^2
</str>
</requestHandler>
在网上找了这两个参数的定义:
pf: 可提供对一条记录的多个字段做匹配的功能 qf: 针对查询的每个字段设置不同的boost权重打分,其设置的字段必须为在pf中配置的项。
事例解释:
http://localhost:8080/solr/select?defType=dismax&qf=name^10 summary ^1 &q=平凡的世界&pf=name^50 summary ^1&q.op=OR&bf=sum(recip(ms(NOW,createTime),3.16e-11,1,1),div(1000,price))^100 该查询表示:在name和summary 中搜索关键字“平凡的世界”,name和summary 在字段查询中的比重分别为10、1(qf=qf=name^10 summary ^1);并且这两个字段phrase的打分为 pf=name^50 summary ^1,也就是name占的比重为50,而summary占的比重小点;且该查询考虑了书本的价格和书的上架时间(bf=sum(recip(ms(NOW,last_createTime),3.16e-11,1,1),div(1000,price))^100)
bf可以自己实现自己的定义。 关于多字段检索也可看看这篇文章的介绍:http://adminjun.iteye.com/blog/2258480
在实际项目中可能会存储clob类型的字段,这就需要另外的处理,详细请参照博客:http://blog.csdn.net/u010248330/article/details/72957645
solr联合多个字段进行检索(multivalued和copyfield的使用)的更多相关文章
- MYSQ创建联合索引,字段的先后顺序,对查询的影响分析
MYSQ创建联合索引,字段的先后顺序,对查询的影响分析 前言 最左匹配原则 为什么会有最左前缀呢? 联合索引的存储结构 联合索引字段的先后顺序 b+树可以存储的数据条数 总结 参考 MYSQ创建联合索 ...
- Solr内置的字段类型
字段类型在org.apache.solr.schema包下 Class 描述 BCDIntField 二进制整形字段 BCDLongField 二进制长整形字段 BCDStrField 二进制字符型字 ...
- Solr页面查询各个字段参数解释
q:查询的关键字,此参数最为重要,例如,q=id:1,默认为q=*:*,类似于sql中的where 1=1. fq(filter query):过滤查询,提供一个可选的筛选器查询.返回在q查询符合结果 ...
- MyBatis 多表联合查询,字段重复的解决方法
MyBatis 多表联合查询,两张表中字段重复时,在配置文件中,sql语句联合查询时使用字段别名,resultMap中对应的column属性使用相应的别名: <resultMap type=&q ...
- Solr局部或指定字段更新之set用法
solr wiki文档也有 http://yonik.com/solr/atomic-updates/ java code public static void up ...
- oracle 大字段clob检索
select * from tab_name twhere dbms_lob.instr(t.daziduan, 'aaa', 1, 1) > 0;
- Solr5.3.1通过copyField设置多个field(字段)同时检索
如果业务需要我们对多个field同时进行检索,有没有什么好的办法呢?非常幸运的是Solr为我们提供了copyField对多个field进行索引和检索.然而配置也非常简单. 修改schame.xml,添 ...
- 1.4.2 solr字段类型--(1.4.2.1)字段类型定义和字段类型属性
1.4.2 solr字段类型 (1.4.2.1) 字段类型定义和字段类型属性. (1.4.2.2) solr附带的字段类型 (1.4.2.3) 使用货币和汇率 (1.4.2.4) 使用Dates(日期 ...
- solr注意事项-solrconfig中的默认搜索域会覆盖schema中的默认搜索域,注意copyfeild中被corp的字段搜索
结论一:solrconfig.xml的默认搜索配置权限高于schema.xml中的默认搜索配置! 配置1:solrconfig.xml文件中关于select的配置: <requestHandle ...
随机推荐
- Hadoop streaming使用自定义python版本和第三方库
在使用Hadoop的过程中,遇到了自带python版本比较老的问题. 下面以python3.7为例,演示如何在hadoop上使用自定义的python版本以及第三方库. 1.在https://www.p ...
- VC++实现解析快捷方式
VC++实现解析快捷方式: http://blog.csdn.net/mydreamremindme/article/details/9826745
- spark 与 Hadoop 融合后启动 slf4j提示Class path contains multiple SLF4J bindings
相关参考文献: https://www.oschina.net/question/93435_174549 警告信息如下: 看起来明明就是一个文件,怎么还提示multiple bindings呢,sl ...
- How to convert int [12] to array<int, 12>
code: // array::data #include <iostream> #include <cstring> #include <array> int m ...
- No.01——配置编程环境
======由于很喜欢Android编程,所以买来了安卓权威指南来学习.为了应用费曼技巧——把知识输出出去以检验和巩固,在此写下学习笔记======= 1. 配置编程环境 Java的JDK(Java ...
- HihoCoder - 1886 :中位数2(贪心)
描述 对于一个长度为n的数列A,我们如下定义A的中位数med(A): 当n是奇数时,A的中位数是第(n+1)/2大的数:当n是偶数时,A的中位数是第n/2大的数和第n/2+1大的数的平均值. 同时,我 ...
- hdu2073-2078
hdu2073 数学 #include<stdio.h> #include<math.h> double len(double x){ )*(x+)); } int main( ...
- 将string str中的str转换成字符数组
#include <iostream> #include <map> #include <string.h> using namespace std; int ma ...
- 命令行net time同步时间(内网)
首先还是推荐大家使用Internet时间来同步自己计算机的时间,这样做主要是方便,就是设置一个ntp服务器,我推荐下面的三个ntp服务器地址. time.asia.apple.com //亲测有效 a ...
- Nginx服务器抵御CC攻击的相关配置讲解
CC攻击利用代理服务器向网站发送大量需要较长计算时间的URL请求,如数据库查询等,导致服务器进行大量计算而很快达到自身的处理能力而形成DOS.而攻击者一旦发送请求给代理后就主动断开连接,因??代理并不 ...