Solr之查询索引。

来源:互联网 发布:电力网络大学视频 编辑:程序博客网 时间:2024/06/04 23:31

        Solr在不修改任务配置的情况下就可以使用查询功能,在web项目中应用可以直接URL进行访问Solr服务器例如:

http://localhost:8080/solr/collection1/select?q=*%3A*&wt=xml&indent=true

        上面的意思就是查询名为collection1的SolrCore的所有内容用xml格式返回并且有缩进,返回结果如下:

<?xml version = "1.0" encoding = "UTF-8" ?>

<response>

<lst name = "responseHeader">

<int name = "status">0</int>

<int name = "QTime">0</int>

<lst name = "params">

<str name = "indent">true</str>

<str name = "q">*.*</str>

<str name = "wt">xml</str>

</lst>

</lst>

<result name = "response" numFound = "17971" start = "0">

<doc>

<str name = "path">E:\Reduced\军事\1539.txx</str>

<str name = "category_s">2</str>

<int name = "browseCount_i">1423701734</int>

<long name = "modified_l">1162438568000</long>

<long name = "releasedate_l">1162438568000</long>

<str name = "content"> [俄罗斯lenta网站2006年2月9日报道]俄空军副总司令比热耶夫中将称,2006年春天独联体国家防空系统打击范围向西推进150千米,侦察范围向西推进400千米。  2006年3月白俄罗斯4个S-300PS防空导弹营担负战斗任务,使独联体防空系统作战范围得以向西推进。比热耶夫中将还宣布,近期乌兹别克斯坦可能加入独联体防空系统。  独联体国家防空系统建于9年前,共有9个国家参加该组织。目前只有亚美尼亚、白俄罗斯、哈萨克斯坦、吉尔吉斯、俄罗斯和塔吉克斯坦支持该体系。  乌克兰、乌兹别克斯坦与俄罗斯在双边基础上合作,格鲁吉亚和土库曼最近7年不参加独联体国家对空防御。</str>

<str name = "id">E3798D82-EAB6-2BEA-D7E2-79FBD102E845</str>

<long name = "_version_">1436361868021071872</long>

</doc>

...

</result>

</response>

       上面所看到的就是用xml格式返回的查询结果,其中的doc就是一个文档,在doc里面的那个就是我们开始在schema.xml中定义的字段。

       如果使用SolrJ进行调用的话代码如下:

SolrQuery query = new SolrQuery();

query.set("q" , "*.*");

QueryResponse rsp = server.query(query);

SolrDocumentList list = rsp.getResults();

       返回结果在SolrDocumentList中在这个对象中遍历取出值来:

for(int i = 0 ; i < list.size() ; i ++ ) {

SolrDocument sd = list.get(i);

String id (String) sd.getFieldValue("id");

System.out.printlnl(id);

}

查询参数

名称描述q查询字符串,必须的。fqfilter query。使用Filter Query可以充分利用Filter Query Cache,提高检索性能。作用:在q查询符合结果中同时是fq查询符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找关键字mm,并且date_time是20081001到20091031之间的。flfield list。指定返回结果字段。以空格“”或逗号“,”分隔。start用于分页定义结果起始记录数,默认为0.rows用于分页定义结果每页返回记录数,默认为10.sort排序,格式:sort=<fieldname> + <desc|asc>[<fieldname> + <desc|asc>]。示例,(inStock desc , price asc) 表示先“inStock”降序,再“price”升序,默认是相关性降序。df默认的查询字段,一般默认指定。q.op覆盖schema.xml的defaultOperator(有空格时用“AND”还是用“OR”操作逻辑),一般默认指定。必须大写。wtwriter type。指定查询使用输出结构格式,默认为“xml”。qtquery type,指定查询使用的Query Handler,默认为“standard”。explainOther设置当debugQuery=true时,显示其他的查询说明。defType设置查询解析器名称。timeAllowed设置查询超时时间。omitHeader设置是否忽略查询结果返回头信息,默认为“false”。indent返回的结果是否缩进,默认关闭,用indent=true|on开启,一般调试json,php,phps,ruby输出才有必要用这个参数。version查询语法的版本,建议不使用它,由服务器指定默认值。debugQuery设置返回结果是否显示Debug信息。

查询语法

  • 匹配所有文档:*:*。
  • 强制、阻止和可选查询
    • Mandatory:查询结果中必须包括的(for example,only entry name containing the word make)

Solr/Lucene Statement:+make,+make+up,+make+up+kiss

  • prohibited:(for example,all documents except those with word belive)

Solr/Lucene Statement:+make +up -kiss

  • optional:

Solr/Lucene Statement:+make +up kiss

  • 布尔操作:AND、OR和NOT布尔操作(必须大写)与Mandatory、optional和prohibited相似。
    • make AND up = +make + up: AND 左右两边的操作都是mandatory。
    • make || up = make OR up = make up : OR 左右两边的操作都是 optional。
    • +make +up NOT kiss = +make  +up -kiss
    • make AND up OR french AND Kiss 不可以达到期望的结果,因为AND两边的操作都是mandatory的。
  • 子表达式查询(子查询):可以使用“0”构造子查询。

示例:(make AND up) OR (french AND Kiss)

  • 子表达式查询中阻止查询的限制

示例:make( -up) :只能取得make的查询结果;要使用make (-up *:*)查询make或者不包括up的结果。

  • 多字段fields查询:通过字段名加上分号的方式(fieldName:query)来进行查询。

示例:entryNm:make AND entryId:3cdc86e8e0fb4da8ab17caed42f6760c

  • 通配符查询(wildCard Query)
    • 通配符 ? 和 * :“*”表示匹配任意字符;“?”表示匹配出现的位置。

示例:ma?*(ma后面的一个位置匹配),ma??*(ma后面两个位置都匹配)

  • 查询字符必须要小写:+Ma +be**可以搜索到结果;+Ma +Be**没有搜索结果。
  • 查询速度较慢,尤其是通配符在首位:主要原因一是需要迭代查询字段中的每个term,判断是否匹配;二十匹配上的term被加到内部的查询,当terms数量达到1024的时候,查询会失败。
  • Solr中默认通配符不能出现在首位(可以修改QueryParser,设置setAllowLeadingWildcard为true)。
  • 设置setAllowLeadingWildcard为true。
  • 模糊查询、相似查询:不是精确地查询,通过对查询的字段进行重新插入、删除和转换来取得得分较高的查询解决(由Levenstein Distance Algorithm算法支持)。
    • 一般模糊查询:示例,make-believ~
    • 门槛模糊查询:对模糊查询可以设置查询门槛,门槛是0~1之间的数值,门槛越高表面相似度越高。示例,make-believ~0.5、make-believ~0.8、make-believ~0.9。
    • 范围查询(Range Query):Lucene支持对数字、日期甚至文本的范围查询。结束的范围可以使用“*”通配符。

示例:

  • 日期范围(ISO-8601 时间GMT):sa_type:2 AND a_begin_date:[1990-01-01T00:00:00.000Z TO 1999-12-31T24:59:99.999Z]
  • 数字:salary:[2000 TO *]
  • 文本:entryNm:[a TO a]
  • 日期匹配:YEAR,MONTH,DAY,DATE(synonymous with DAY) HOUR,MINUTE,SECOND,MILLISECOND,and MILLI(synonymous with MILLISECOND)可以被标志成日期。

示例:

  • r_event_date:[* TO NOW-2YEAR]:2年前的现在这个时间。
  • r_event_date:[* TO NOW/DAY-2YEAR]:2年前前一天的这个时间。

函数查询(Function Query)

        函数查询,可以利用numeric字段的值或者与字段相关的某个特定的值得函数,来对文档进行评分。

使用函数查询的方法

        这里主要有三种方法可以使用函数查询,这三种方法都是通过solr http接口的。

  • 使用FunctionQParserPlugin。ie:q={!func}log(foo)
  • 使用“_val_”内嵌方法。

内嵌在正常的solr查询表达式中。即,将函数查询写在 q 这个参数中,这时候,我们使用“_val_”将函数与其他的查询加以区别。

ie: netryName:make && _val_:ord(entryNm)

  • 使用dismax中的bf参数。

使用明确为函数查询的参数,比如说dismax中的bf(boost function)这个参数。注意:bf这个参数可以接受多个函数查询的,他们之间用空格隔开,他们还可以带上权重。所以,当我们使用bf这个参数的时候,我们必须保证单个函数中是没有空格出现的,不然程序有可能会以为是两个函数。

示例:

q=dismax&bf="ord(proularity)^0.5 recip(rord(price),1,1000,1000)^0.3"

函数的格式(Function Query Syntax)

        目前,function query 并不支持 a+b这样的形式,我们得把他写成一个方法形式,这就是sum(a,b)。

使用函数查询注意事项

  • 用于函数查询的field必须是被索引的;
  • 字段不可以是多值(multi-value)。

可以利用的函数(avaliable function)

  • constant:支持有小数点的常量;例如:1.5;SolrQuerySyntax:_val_:1.5
  • fieldvale:这个函数将会返回numeric field的值,这个字段必须是indexed的,非multiValued的。格式很简单,就是该字段的名字。如果这个字段中没有这样的值,那么将会返回0.
  • ord:对于一个字段,它所有的值都将会按照字典顺序排列,这个函数返回你要查询的那个特定的值在这个顺序中的排名。这个字段,必须是非multiValued的,当没有值存在的时候,将返回0.例如:某个特定的字段只能去三个值,“apple”、“banana”、“pear”,那么ord("apple")=1,ord("banana")=2,ord("pear")=3,需要注意的是,ord()这个函数,依赖于值在索引中的位置,所以当有文档被删除或者添加的时候,ord()的值就会发生变化。当你使用MultiSearcher的时候,这个值也就是不定的了。
  • rord:这个函数将会返回与ord相对应的倒排序的排名。

格式:rord(myIndexedField)。

  • sum:这个函数的意思就显而易见,他就是表示“和”。

格式:sum(x , 1)、 sum(x , y)、sum(sqrt(x) , log(y) , z , 0.5)

  • product:product(x , y , ...) 将会返回多个函数的乘积。
格式:product(x , 2) 、product(x , y)
  • div:div(x , y)表示x除以y的值。

格式:div(1 , x) 、 div(sum(x , 100) , max (y , 1))

  • pow:pow表示幂值。
pow(x , y) = x ^ y。例如:pow(x , 0.5) 表示开方 pow(x , log(y))。
  • abs:abs(x)将返回表达式的绝对值。

格式:abs(-5)、abs(x)

  • log:log(x)将会返回基数为10,x的对数。

格式:log(x)、log(sum(x , 100))

  • Sqrt:sqrt(x)返回一个数的平方根。
格式:sqrt(2)、sqrt(sum(x , 100))
  • Map:如果x >= min,且 x <= max,那么map(x,min,max,target) = target;如果x不再[min , max] 这个区间内,那么map(x , min , max ,target) = x。

格式:map(x , 0 , 0 , 1)

  • Scale:scale(x , minTarget , maxTarget) 这个函数将会把x的值限制在[minTarget , maxTarget]范围内。
  • query:query(subquery , default)将会返回给定subquery的分数,如果subquery与文档不匹配,那么将会返回默认值。任何的查询类型都是受支持的。可以通过应用的方式,也可以直接指定查询串。

示例:q = product(popularity , query({!dismax v = 'solr rocks'})) 将会返回popularity和通过dismax查询得到的分数的乘积。

q = product(popularity , query($qq)&qq={!dismax} solr rocks)跟上一个例子的效果是一样的。不过这里使用的是引用的方式。

q = product(popularity , query($qq , 0.1))&qq ={!dismax} solr rocks)在前一个例子的基础上又加了一个默认值。

  • linear:linear(x , m , c) 表示m*x+c,其中m和c都是常量,x是一个变量也可以是一个函数。
例如:linear(x , 2 , 4) = 2*x+4。
  • Recip:recip(x , m , a , b) = a/(m*x+b),其中,m、a、b是常量,x是变量或者一个函数。当a=b并且x>=0的时候,这个函数的最大值是1,值得大小随着x的增长而减小。

例如:recip(rord(creationDate) , 1 , 1000 , 1000)。

  • Max:max(x , c)将会返回一个函数和一个常量之间的最大值。

例如:max(myfield , 0)


原创粉丝点击