Solr查询详解

2019-03-27 01:07|来源: 网路

前言:上节是关于Solr的开发准备工作:.NET开发过程中的全文索引使用技巧之Solrhttp://www.cnblogs.com/johnwood/p/3447242.html

这节重点是讲Solr的查询相关的知识点

一、 查询参数说明

 

在做solr查询的时候,solr提供了很多参数来扩展它自身的强大功能!以下是使用频率最高的一些参数! 

 

1、常用 

q - 查询字符串,这个是必须的。如果查询所有*:* ,根据指定字段查询(Name:张三 AND Address:北京

fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如:q=Name:张三&fq=CreateDate:[20081001 TO 20091031],找关键字mm,并且CreateDate是20081001

fl - 指定返回那些字段内容,用逗号或空格分隔多个。 

start 返回第一条记录在完整找到结果中的偏移位置,0开始,一般分页用。 

rows 指定返回结果最多有多少条记录,配合start来实现分页。 

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

wt - (writer type)指定输出格式,可以有 xmljsonphpphps。 

fl表示索引显示那些field( *表示所有field,如果想查询指定字段用逗号或空格隔开(如:Name,SKU,ShortDescription或Name SKU ShortDescription【注:字段是严格区分大小写的

q.op 表示中 查询语句的 各条件的逻辑操作 AND() OR(

hl 是否高亮 ,如hl=true

hl.fl 高亮field ,hl.fl=Name,SKU

hl.snippets :默认是1,这里设置为3个片段

hl.simple.pre 高亮前面的格式 

hl.simple.post 高亮后面的格式 

facet 是否启动统计 

facet.field  统计field 

【注:以上是比较常用的参数,当然具体的参数使用还是多看Solr官方的技术文档以及一些大神的博文日志,这里只是抛砖引玉】

 

二、 Solr运算

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]
13. {} 不包含范围检索,如检索某时间段记录,不包含头尾
date:{200707 TO 200710}
14. / 转义操作符,特殊字符包括+ - && || ! ( ) { } [ ] ^ ” ~ * ? : /

 注:①“+”和”-“表示对单个查询单元的修饰,and 、or 、 not 是对两个查询单元是否做交集或者做差集还是取反的操作的符号

   比如:AB:china +AB:america ,表示的是AB:china忽略不计可有可无,必须满足第二个条件才是对的,而不是你所认为的必须满足这两个搜索条件

   如果输入:AB:china AND AB:america ,解析出来的结果是两个条件同时满足,即+AB:china AND +AB:america或+AB:china +AB:america

  总而言之,查询语法:  修饰符 字段名:查询关键词 AND/OR/NOT 修饰符 字段名:查询关键词

三、 Solr查询语法

1.最普通的查询,比如查询姓张的人( Name:张),如果是精准性搜索相当于SQL SERVER中的LIKE搜索这需要带引号(""),比如查询含有北京的(Address:"北京")

2.多条件查询,注:如果是针对单个字段进行搜索的可以用(Name:搜索条件加运算符(OR、AND、NOT) Name:搜索条件),比如模糊查询( Name:张 OR Name:李 )单个字段多条件搜索不建议这样写,一般建议是在单个字段里进行条件筛选,如( Name:张 OR 李),多个字段查询(Name:张 + Address:北京 

3.排序,比如根据姓名升序(Name asc),降序(Name desc


转自:http://www.cnblogs.com/lixiuran/p/3678487

相关问答

更多
  • public static Map<String, Integer> queryByGroup(String qStr,String groupField,String sortField,boolean asc,Integer pageSize,Integer pageNum){ Map<String, Integer> rmap = new LinkedHashMap<String, Integer>(); try { SolrServer server = getS ...
  • 简单的说使用solrJ. 也就是通关java代码的方式增加索引 然后再调用一系列方法查出索引。 给你个我学习时的链接http://blog.sina.com.cn/s/blog_64ac3ab10100t3mq.html 友情提示:这种问题去论坛问比较好。csdn iteye 等等
  • 我不知道为什么这不工作,但这是逻辑上相同的,它的工作: -(myField:superneat AND -myOtherField:somethingElse) 也许这与在查询中定义相同的字段两次有关 尝试在solr-user组中询问,然后在这里发回最后的答案! I don't know why that doesn't work, but this one is logically equivalent and it does work: -(myField:superneat AND -myOther ...
  • 简单。 您可以查看分析仪链以了解发生的情况。 我的猜测是,分析器链将/转换为空格 - 这使得查询成为 duties: health nurse 要从配置中找出您的分析仪链 - 首先检查字段的类型 例如 现在我们寻找类型的定义
    您不能只将响应中的内容复制到配置文件中 - 这两种格式完全不同。 引用的是, defaults部分中的每个条目都被添加到查询字符串中(除非它们已经在那里提供 - 如果要强制某个不能被覆盖的值,也有选项)。 [...] somehost:port1/s ...
  • ES已经为此进行了渗透 - 对于Solr,您通常会将文档索引为基于内存的核心/索引中的单个文档,然后针对该文档运行查询(这是ES至少在内部执行的操作,IIRC)。 ES has percolate for this - for Solr you'll usually index the document as a single document in a memory based core / index and then run the queries against that (which is wha ...
  • q=*:*搜索所有文档中的所有内容,因此您可以获得结果。 q=white将在默认搜索字段中搜索白色,如果您尚未修改schema.xml,则通常是文本。 text 您可以将默认字段更改为要搜索的字段。 或使用特定字段搜索特定字段,例如标题q=title:white 如果要搜索多个字段,可以使用copyfields将字段组合到一个字段中,或使用dismax请求处理程序。 q=*:* searches for all conten ...
  • 首先,我认为Solr通配符比“1或多个”更好地归纳为“0或多个”。 我怀疑这是你问题的根源。 (例如,请参阅WildcardQuery的javadoc 。) 其次,你是否在使用词干,因为我的第一个猜测是你正在处理一个词干问题。 Solr通配符在词干方面可能表现得很奇怪。 这是因为通配符扩展是通过搜索存储在倒排索引中的术语列表来进行的; 这些术语将以词干形式出现(可能类似“gatorad”),而不是来自原始源文本(可能是“gatorade”或“gatorades”)的单词。 例如,假设你有一个词干分析器,把“ ...
  • 您对OR运算符的期望是条件行为 。 Solr中定义的运算符( OR和AND )分别用于执行结果的并集和交集 。 你无法实现条件行为。 Solr布尔运算符 What you are expecting from OR operator is a conditional behavior. The operators (OR and AND) defined in the Solr are for performing union and intersection of the results respecti ...
  • 这样做的一种方式是在fq中使用连接查询,并且它也适用于MLT。 就像是: &fq =(!从=位置连接到=位置)DocumentID:1234 One way of doing this would be using join query in fq and it works for MLT as well. Something like: &fq=(!join from=location to=location)DocumentID:1234