欢迎投稿

今日深度:

Solr IV——Solr查询,

Solr IV——Solr查询,


    本文分为两部分,第一部分是对查询语法的介绍,第二部分是对这些语法进行实际测试。
常用查询参数 常用基本查询: q 查询条件,是一个字符串。该字符串是非空的,如果没有任何查询条件,需要写成 *:*。如果有查询条件,例如要查name的值为Tom的,则需要写成 name:Tom。具体的使用经验,请参见第二部分——实践。
fq(filter query) 过滤查询,作用是在符合q的条件的基础上,同时还要符合fq的条件。使用方法同q。
fl 指定要查询哪些字段。如果不填或填*,则是查询所有,相当于SQL语句中的 SELECT *。如果要查询特定几个字段,则直接写上字段名,多个字段间用逗号或空格分开。
start 用于分页,返回第一条记录在完整找到结果中的偏移位置,即第一条记录的索引,从0开始。
rows 用于分页,指定返回结果最多有多少条记录,一般配合start使
sort 排序,格式:sort=<field name> + <desc | asc>[,<field name> + <desc | asc>]…。例:按年龄和姓名排序:age desc, name asc。这个例子是先按年龄降序排序,在相同的年龄段中,按姓名首字母升序排序。
wt(write type) 指定输出格式,可以有xml、json、php、phps

Solr运算符 : 用于在查询字段时,给字段指定值。如 name:张三
? 表示匹配单个任意字符的通配符
* 表示匹配多个任意字符的通配符
~ 表示模糊检索,如检索拼写类似于*roam*的项这样写:roam~将找到形如foam和roams的单词。roam~0.8,检索返回相似度在0.8以上的记录。如果检索相邻10个单词的"apache"和"jakarta",需要用"jakarta apache"~10
AND、&& 执行 且、与 操作
OR、|| 执行 或 操作
NOT、!、- 排除操作符。例如,想要查询除了name叫张三的数据,可以如下表达:NOT name:张三、!name:张三、-name:张三
+ 存在操作符,要求+后面跟的条件在文档中必须满足。例如 +name:张三 代表查询name值为张三的所有数据
( ) 用于构成子查询
[ ] 范围检索(包含头尾的检索),如检索某时间区间内的记录,如:[201507 TO 201509]
{} 范围检索(不包含头尾的检索),如检索某时间区间内的记录,如:{201507 TO 201509}
\ 转义操作符,可以将特殊字符进行转义。特殊字符包括:+ - && || ! ( ) [ ] { } ^ " ~ * ? : \




查询实践     在实践查询语法之前,先假设一下已有的数据及其结构:     假设我现在Solr服务器中有个Core叫user。user的结构如下:   <fields>    <field name="id" type="string" indexed="true" stored="true"            required="true" multiValued="false" />
   <field name="name" type="string" indexed="true" stored="true"/>    <field name="age" type="int" indexed="true" stored="true"/>    <field name="birthday" type="string" indexed="true" stored="true"/>    <field name="identityID" type="string" indexed="true" stored="true"/>    <field name="content" type="text_zh" indexed="true" stored="true"/>
   <field name="text" type="string" indexed="true" stored="false" multiValued="true"/>
   <!-- 保留字段,不能删除,否则报错 -->    <field name="_version_" type="long" indexed="true" stored="true"/>      </fields>
 <copyField source="name" dest="text"/>  <copyField source="identityID" dest="text"/>
 <!-- 文档的唯一标识,可理解为主键,除非标识为required="false", 否则值不能为空-->  <uniqueKey>id</uniqueKey>
  <types>     <!-- 字段类型定义 -->     <fieldType name="string" class="solr.StrField" sortMissingLast="true" />     <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>     <fieldType name="int" class="solr.TrieIntField" precisionStep="0"         positionIncrementGap="0"/>     <fieldType name="float" class="solr.TrieFloatField" precisionStep="0"         positionIncrementGap="0"/>     <fieldType name="long" class="solr.TrieLongField" precisionStep="0"         positionIncrementGap="0"/>     <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0"         positionIncrementGap="0"/>     <fieldType name="date" class="solr.TrieDateField" precisionStep="0"         positionIncrementGap="0"/>  <fieldType name="text_zh" class="solr.TextField" positionIncrementGap="100">   <analyzer>    <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex"/>   </analyzer>  </fieldType>  </types>

现有用于测试的全部数据是这样的,一共有2条数据:

q查询所有: 条件:q = *:* 结果:没有任何查询条件,查询所有数据,以下是结果(屏幕不够大,下方部分结果没有被显示出来)


q查询: 条件:q = name:lisi 结果:查询所有name值为lisi的所有数据,以下是结果


q模糊查询: 条件:q= name:zhang* 结果:查询所有name值以zhang开头的所有数据,以下是结果



fl指定查询字段 条件:q = *:*  fl = name,age 结果:只将所有数据的name和age两个字段的值查询出来了

AND(&&) 多条件查询 条件:q = name:lisi AND age:27 (q = name:lisi && age:27 也是同样的效果) 结果:查询出了同时满足name和age条件的数据,以下是结果


OR (||) 多条件查询 条件:q = name:lisi OR name:zhangsan* (q = name:lisi || name:zhangsan* 也是同样的效果) 结果:查询出了名字叫lisi或名字以zhangsan开头的数据,以下是结果


单字段多条件筛选(相当于SQL里的IN) 条件:q = name:lisi OR zhangsan* 结果:查询所有名字是lisi或以zhangsan开头的数据,如果所有条件都属于一个字段,建议这么查询,而不是上面那样查,以下是结果


NOT (-) 排除查询 条件:-name:lisi (NOT name:lisi效果相同) 结果:查询所有name值不为lisi的数据,以下是结果

[] 范围查询 条件:q = age:[26 TO 30] 结果:查询出所有age值在26-30之间的数据,且包括26和30这两个边界值,以下是结果


{}范围查询 条件:q = age:{26 TO 30} 结果:查询出所有age值在26-30之间的数据,且不包括26和30这两个边界值,以下是结果









www.htsjk.Com true http://www.htsjk.com/solr/28729.html NewsArticle Solr IV——Solr查询,     本文分为两部分,第一部分是对查询语法的介绍,第二部分是对这些语法进行实际测试。 常用查询参数 常用基本查询: q查询条件,是一个字符串。该字符串是...
相关文章
    暂无相关文章
评论暂时关闭