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这两个边界值,以下是结果
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。