Solr查询

篇一:solr查询需求转换

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. \ 转义操作符,特殊字符包括+ - && || ! ( ) { } [ ] ^ ” ~ * ? : \

Solr支持的需求“转化”方案小结

1. A>B转化 A>B 的结果保存为新的域,查询时候使用新的域作为条件查

2. sum(A,B)>N 转化为 sum(A,B)的值保存为新的域,查询时候 [N TO *] 区间查询代替

3. 非空查询 转化为 对应数值型,使用区间[0 TO *] ,对应文本类型 转化为 构建时候写入默认值

4. 按期望的得分模型排序 转化为,离线根据自定义的模型,计算好一个document-at-time得分,排序时候直接按这个单维度得分排序。问题可能会出现好的越好、坏的越坏

5. 文本得分和属性得分联合 转化为第一维度文本、第二维度属性值 或者 文本*因子+ _val_ 得分

6. 输入提示 转化为基于当前索引的词典的termquerycomponent 或者 独立一个倒排索引,保存词典,此时各种提示转化为倒排的前缀、模糊搜索,同时控制相关联词条的排序规则,包括屏蔽和加强关键词

7. 带特征的单维度实时统计 转化为带特征去查询索引然后facet,将facet结果存入数据库共访问。

8. topN查询词条 直接对query log 执行再次倒排索引,输出高频词以及高频关联词

9. 实时可累加的统计 直接实时构建索引,输出索引的term、倒排的统计信息。

10.突出特定信息转化为特定关键词的boost或者特定域的boost或者特定文档的boost

11.人名搜索 转化为单子分词并短语查询和属性排序

12.list查询 转化为直接基于lucene的MultiTermQuery,能缓存的尽量缓存起来

13.规则推荐 转化为多属性组合查询唯一规则id返回

14.一次写膨胀性增加 转化为分时间段构建索引、按需加载、卸载索引段

15.多表关联 转化为离线join一起构成文档,查询直接key返回文档,无需多表join

16.sqllike查询 转化为基于词法、句法分析转化为对应语句模板,模板自动生成solr语法

17.关系距离排序转化为tfitf公式不变而数值用关系维度值代替或者直接function计算关系夹角

18.概率模型、语言模型 转化为引入第三方包实现的得分模型,同时需要调整某些参数根据具体场景

19.空间搜素 转化为关键词到经纬度索引查询,引入第三方包实现的相关插件

20.图片过滤 转化为在图片算法过滤的同时,联合文本查询过滤,实现高质量聚合

21.传递推荐 转化为关键词结果的统计输出,输出条件查询进一步统计输出。。。

22.数据结构化转化为检索词返回规则,构建可重复计算的特征性结构化数据。

。。。。

所有的需求转化本质,大概可以如下理解:

(1)发挥solr或者lucene的一对一关联,term与document 的关联

(2)通过单一属性,返回关联属性;

(3)索引构建完毕静态信息可以根据条件实时、重复获取

(4)复杂问题离线化,线上实时只读

(5) 大的东西从开源、第三方包获取,细的参数、微调从业务场景出发

篇二:Solr查询,Solr语法,Solr更新

一.基本查询

q – 查询字符串,必须的。

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

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

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

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

wt – (writer type)指定输出格式,可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开。

fq – (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找关键字mm,并且date_time是20081001到20091031之间的。

q.op – 覆盖schema.xml的defaultOperator(有空格时用”AND”还是用”OR”操作逻辑),一般默认指定

df – 默认的查询字段,一般默认指定

qt – (query type)指定那个类型来处理查询请求,一般不用指定,默认是standard。

- 排除在要排除的词前加上 “-” (不包含”号) 号

其它

indent – 返回的结果是否缩进,默认关闭,用 indent=true|on 开启,一般调试json,php,phps,ruby输出才有必要用这个参数。 version – 查询语法的版本,建议不使用它,由服务器指定默认值。

[Solr的检索运算符]

“:” 指定字段查指定值,如返回所有值*:*2

“?”2表示单个任意字符的通配

“*” 表示多个任意字符的通配(不能在检索的项开始使用*或者?符号)2

“~”2表示模糊检索,如检索拼写类似于”roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回相似度在0.8以上的记录。 2邻近检索,如检索相隔10个单词的”apache”和”jakarta”,”jakarta apache”~10

“^”2控制相关度检索,如检索jakarta apache,同时希望去让”jakarta”的相关度更加好,那么在其后加上”^”符号和增量值,即jakarta^4 apache 布尔操作符AND、||2

布尔操作符OR、2&&

布尔操作符NOT、!、-2(排除操作符不能单独与项使用构成查询)

“+” 存在操作符,要求符号”+”后的项必须在文档相应的域中存在2

( ) 用于构成子查询2

2 [] 包含范围检索,如检索某时间段记录,包含头尾,date:[200707 TO 200710]

{}2不包含范围检索,如检索某时间段记录,不包含头尾

date:{200707 TO 200710}

” 转义操作符,特殊字符包括+ – & | ! ( ) { } [ ] ^ ” ~ * ? : “

二.高亮

hl-highlight,h1=true,表示采用高亮。可以用h1.fl=field1,field2 来设定高亮显示的字段。

? hl.fl: 用空格或逗号隔开的字段列表。要启用某个字段的highlight功能,就得保证该字段在schema中是stored。如果该参数未被给出,那么就会高 亮默认字段 standard handler会用df参数,dismax字段用qf参数。你可以使用星号去方便的高亮所有字段。如果你使用了通配符,那么要考虑启用 hl.requiredFieldMatch选项。

? hl.requireFieldMatch:

如果置为true,除非该字段的查询结果不为空才会被高亮。它的默认值是false,意味 着它可能匹配某个字段却高亮一个不同的字段。如果hl.fl使用了通配符,那么就要启用该参数。尽管如此,如果你的查询是all字段(可能是使用 copy-field 指令),那么还是把它设为false,这样搜索结果能表明哪个字段的查询文本未被找到

?

?

? hl.usePhraseHighlighter: 如果一个查询中含有短语(引号框起来的)那么会保证一定要完全匹配短语的才会被高亮。 hl.highlightMultiTerm 如果使用通配符和模糊搜索,那么会确保与通配符匹配的term会高亮。默认为false,同时hl.usePhraseHighlighter要为true。 hl.snippets:

这是highlighted片段的最大数。默认值为1,也几乎不会修改。如果某个特定的字段的该值被置为0(如f.allText.hl.snippets=0),这就表明该字段被禁用高亮了。你可能在hl.fl=*时会这么用。

 hl.fragsize: 每个snippet返回的最大字符数。默认是100.如果为0,那么该字段不会被fragmented且整个字段的值会被返回。大字段时不会这么做。 hl.mergeContiguous: 如果被置为true,当snippet重叠时会merge起来。 hl.maxAnalyzedChars: 会搜索高亮的最大字符,默认值为51200,如果你想禁用,设为-1 hl.alternateField: 如果没有生成snippet(没有terms 匹配),那么使用另一个字段值作为返回。 hl.maxAlternateFieldLength: 如果hl.alternateField启用,则有时需要制定alternateField的最大字符长度,默认0是即没有限制。所以合理的值是应该为 hl.snippets * hl.fragsize这样返回结果的大小就能保持一致。 hl.formatter:一个提供可替换的formatting算法的扩展点。默认值是simple,这是目前仅有的选项。 显然这不够用,你可以看看org.apache.solr.highlight.HtmlFormatter.java 和 solrconfig.xml中highlighting元素是如何配置的。 注意在不论原文中被高亮了什么值的情况下,如预先已存在的em tags,也不会被转义,所以在有时会导致假的高亮。 hl.fragmenter:

这个是solr制 定fragment算法的扩展点。gap是默认值。regex是另一种选项,这种选项指明highlight的边界由一个正则表达式确定。这是一种非典型 的高级选项。为了知道默认设置和fragmenters (and formatters)是如何配置的,可以看看solrconfig.xml中的highlight段。 regex 的fragmenter有如下选项:

?

? hl.regex.pattern:正则表达式的pattern hl.regex.slop:这是hl.fragsize能变化以适应正则表达式的因子。默认值是0.6,意思是如果hl.fragsize=100那么fragment的大小会从40-160.

三.分组查询:

1. Field Facet

Facet 字段通过在请求中加入 ”facet.field” 参数加以声明 , 如果需要对多个字段进行 Facet查询 , 那么将该参数声明多次 . 比如

各个 Facet 字段互不影响 , 且可以针对每个 Facet 字段设置查询参数 . 以下介绍的参数既可以应用于所有的 Facet 字段 , 也可以应用于每个单独的 Facet 字段 . 应用于单独的字段时通过

这种方式调用 . 比如 facet.prefix

参数应用于 cpu 字段 , 可以采用如下形式

1.1facet.prefix

表示 Facet 字段值的前缀 . 比如 ”facet.field=cpu&facet.prefix=Intel”, 那么对 cpu字段进行 Facet 查询 , 返回的 cpu 都是以 ”Intel” 开头的 ,”AMD” 开头的 cpu 型号将不会被统计在内 .

1.2facet.sort

表示 Facet 字段值以哪种顺序返回 . 可接受的值为 true(count)|false(index,lex). true(count) 表示按照 count 值从大到小排列 .

false(index,lex) 表示按照字段值的自然顺序 (字母 , 数字的顺序 ) 排列 . 默认情况下为 true(count). 当 facet.limit 值为负数时 ,默认 facet.sort= false(index,lex).

1.3facet.limit

限制 Facet 字段返回的结果条数 . 默认值为 100. 如果此值为负数 , 表示不限制 .

1.4facet.offset

返回结果集的偏移量 , 默认为 0. 它与 facet.limit 配合使用可以达到分页的效果 .

1.5facet.mincount

限制了 Facet 字段值的最小 count, 默认为 0. 合理设置该参数可以将用户的关注点集中在少数比较热门的领域 .

1.6facet.missing

默认为 ””, 如果设置为 true 或者 on, 那么将统计那些该 Facet 字段值为 null 的记录.

1.7facet.method

取值为 enum 或 fc, 默认为 fc. 该字段表示了两种 Facet 的算法 , 与执行效率相关 .

enum 适用于字段值比较少的情况 , 比如字段类型为布尔型 , 或者字段表示中国的所有省份.Solr 会遍历该字段的所有取值 , 并从 filterCache 里为每个值分配一个 filter( 这里要求 solrconfig.xml 里对 filterCache 的设置足够大 ). 然后计算每个 filter 与主查询的交集 .

fc( 表示 Field Cache) 适用于字段取值比较多 , 但在每个文档里出现次数比较少的情况 .Solr 会遍历所有的文档 , 在每个文档内搜索 Cache 内的值 , 如果找到就将 Cache 内该值的count 加 1.

1.8facet.enum.cache.minDf

当 facet.method=enum 时 , 此参数其作用 ,minDf 表示 minimum document frequency. 也就是文档内出现某个关键字的最少次数 . 该参数默认值为 0. 设置该参数可以减少 filterCache 的内存消耗 , 但会增加总的查询时间 ( 计算交集的时间增加了 ). 如果设置该值的话 ,官方文档建议优先尝试 25-50 内的值 .

2. Date Facet

日期类型的字段在文档中很常见 , 如商品上市时间 , 货物出仓时间 , 书籍上架时间等等 . 某些情况下需要针对这些字段进行 Facet. 不过时间字段的取值有无限性 , 用户往往关心的不是某个时间点而是某个时间段内的查询统计结果 . Solr 为日期字段提供了更为方便的查询统计方式 .当然 , 字段的类型必须是 DateField( 或其子类型 ).

需要注意的是 , 使用 Date Facet 时 , 字段名 , 起始时间 , 结束时间 , 时间间隔这 4 个参数都必须提供 .

与 Field Facet 类似 ,Date Facet 也可以对多个字段进行 Facet. 并且针对每个字段都可以单独设置参数 .

2.1facet.date

该参数表示需要进行 Date Facet 的字段名 , 与 facet.field 一样 , 该参数可以被设置多次 , 表示对多个字段进行 Date Facet.

2.2facet.date.start

起始时间 , 时间的一般格式为 ” 1995-12-31T23:59:59Z”, 另外可以使用 ”NOW”,”YEAR”,”MONTH” 等等 , 具体格式可以参考 org.apache.solr.schema. DateField 的 java doc.

2.3facet.date.end

结束时间 .

2.4facet.date.gap

时间间隔 . 如果 start 为 2009-1-1,end 为 2010-1-1.gap 设置为 ”+1MONTH” 表示间隔1 个月 , 那么将会把这段时间划分为 12 个间隔段 . 注意 ”+” 因为是特殊字符所以应该用 ”%2B” 代替 .

2.5facet.date.hardend

取值可以为 true|false, 默认为 false. 它表示 gap 迭代到 end 处采用何种处理 . 举例说明 start 为 2009-1-1,end 为 2009-12-25,gap 为 ”+1MONTH”,hardend 为 false 的话最后一个时间段为 2009-12-1 至 2010-1-1;hardend 为 true 的话最后一个时间段

为 2009-12-1 至 2009-12-25.

2.6facet.date.other

取值范围为 before|after|between|none|all, 默认为 none.

before 会对 start 之前的值做统计 .

after 会对 end 之后的值做统计 .

between 会对 start 至 end 之间所有值做统计 . 如果 hardend 为 true 的话 , 那么该值就是各个时间段统计值的和 .

none 表示该项禁用 .

all 表示 before,after,all 都会统计 .

举例 :

返回结果 :

3. Facet Query

Facet Query 利用类似于

filter query 的语法提供了更为灵活的 Facet. 通过 facet.query 参数 , 可以对任意字段进行筛选 . 例 1:

返回结果 :

篇三:solr 使用自定义的 QueryParser

solr 使用自定义的 QueryParser

发表于:2009年2月9日 | 分类:Solr | 标签: plugin, queryparser, solr | views(3,469) 版权信息: 可以任意转载, 转载时请务必以超链接形式标明文章原文出处, 即下面的声明.

原文出处:http://blog.chenlb.com/2009/02/use-custom-solr-queryparser.html 如果想让 solr 有更加强大的功能或在查询时做一些特别的处理。可以在 solrconfig.xml 里注册自定义的 QueryParser(查询解析器),这是 solr 1.3 的新功能(插件功能),如:

1. <queryParser name="mylucene" class="org.apache.solr.search.MyQParserPlugin" />

query parser 插件时,要先了解下 solr 这方面的结构,下面的QueryParserPlugin 相关类的类图:

写自己的 query parser 插件,基本需要写加个类,MyQParserPlugin、MyQParser、MySolrQueryParser分别扩展QParserPlugin、QParser、SolrQueryParser。 默认情况:solr 是用 OldLuceneQParser 来解析查询,solr 源码中 OldLuceneQParser与LuceneQParser是LuceneQParserPlugin内部类。 扩展QParser时,可以复制 OldLuceneQParser 与 LuceneQParser,然后稍加改一个(把 SolrQueryParser 改为 MySolrQueryParser,还有一些访问属性相关的调整),然后你可以在MySolrQueryParser “胡作非为”,与可以在 MyQParser 查询前做一些特别的处理。

最后打包,个人用这三个类独立打包成my-qparser.jar 放到 solr.home/lib目录下,如果没有手动建一个。

写好了扩展怎么用呢?solr 有一个 defType的参数,比如:你注册自己的QParserPlugin后,如名为mylucene,那么 defType=mylucene。当然还可以这样:在q参数值前面加{!mylucene}。个人认为用defType比较好,这样其它调用的地方不用 改,做到透明——在 standard requestHandler 里加默认的defType参数。

现在可以看下是否自己的查询解析器正常工作:http://localhost:8080/solr/select?indent=on&version=2.2&q=so(转载于:www.CDfdS.cOM 池 锝 网:solr,短语查询)lr&start=0&rows=10&fl=*%2Cscore&debugQuery=on

最近产品的同事反应给我一个搜索的问题,用户在输入如“QueryParser定制”时搜索不到结果,而搜索“QueryParser 定制”,就能找到正确的结果。这个问题导致搜索无结果率偏高。前天开始致力于解决该问题,经过两天的研究,最终通过定制QueryParser解决该问 题。这个问题的解决方案是定制了Solr的QueryParser,下面讲一下如何定制Solr的QueryParser。

我们的搜索引擎使用的是edismax类型,因为一些业务需要用到了edismax提供的特性,因此只能在edismax上做定制。

先做了一下分词测试,“QueryParser定制”与“QueryParser 定制”的分词结果一致。

打开debugQuery,对比“QueryParser定制”与“QueryParser 定制” 输出queryString却不相同。

“QueryParser 定制”显示如下:

“parsedquery”:”+((DisjunctionMaxQuery((goods_title:queryparser)) DisjunctionMaxQuery((goods_title:定制)))~2)”,

“QueryParser定制”则如下:

“parsedquery”:”+DisjunctionMaxQuery((goods_title:\”queryparser 定制\”))”,

从上面两个结果可以看到,分词虽然正确了,但是Edismax的处理方式并不符合预期,只能通过修改源码解决。

找到对应的代码ExtendedDismaxQParserPlugin.java,通过debug研究一下流程后,马上找到要在哪修改了。

修改好源码之后,把这个类放打成lib,部署方式如下:

1、将打好包的放到${solr.home}/lib下,保证Solr在启动时参加载到这个jar。

2、修改solrconfig.xml下面的配置:

添加新的queryParser:

<queryParser name=”newdismax”

class=”com.server.solr.NewExtendedDismaxQParserPlugin”/>

使用新的queryParser:

<requestHandler name="/browse" class="solr.SearchHandler">

<lst name="defaults">

<str name="echoParams">explicit</str>

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

<str name="json.ml">map</str>

<str name="defType">newdismax</str>

<str name="rows">20</str>

<str name="mm">1</str>

<lst>

</requestHandler>

需要注意的是NewExtendedDismaxQParserPlugin中的NAME需要改为配置的newdismax。如下:

public static final String NAME = “newedismax”;

重启Solr后,即可使用该新的QueryParser了,之后有其它的需求也可以通过定制这个类来实现了。

Solr 使用自定义 Query Parser

发表于:2010年8月28日 | 分类:Solr | 标签: plugin, queryparser, solr | views(5,244) 版权信息: 可以任意转载, 转载时请务必以超链接形式标明文章原文出处, 即下面的声明.

原文出处:http://blog.chenlb.com/2010/08/solr-use-custom-query-parser.html

由于 Solr 默认的 Query Parser 生成的 Query 一般是 “短语查询”,导致只有很精确的结果才被搜索出来。大部分时候我们要分词后的 BooleanQuery。一

年半前有篇关于 solr 使用自定义的 QueryParser 的文章。使用这个方法在 solr 中可以用自己的 Query Parser。

按照那篇文章,分别扩展:QParserPlugin、QParser、SolrQueryParser。我把它们实现为:ExtLuceneQParserPlugin、ExtLuceneQParser、SolrQueryParser 源码下载。

配置使用,把 solr-1.4-query-parser-extand-0.1.jar 放到 solr.home/lib 里,同时也把 mmseg4j-all-1.8.2-with-dic.jar 放到 solr.home 当然也可以其它分词器(paoding 可以,看:solr 中使用 paoding 中文分词,N久前验证过 paoding 使用这个扩展可以,有问题通知我)。

schema.xml 加或改:

1. <fieldType name="text_cn" class="solr.TextField" positionIncrem

entGap="100">

2.<analyzer>

3. <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFac

tory"/>

4.</analyzer>

5. </fieldType>

6.

7. <!-- ..... -->

8.

9. <field name="title" type="text_cn" indexed="true" stored="true"

/>

10.

11. <defaultSearchField>title</defaultSearchField>

12. <solrQueryParser defaultOperator="AND"/>

保存 doc-demo.xml,

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

2. <add>

3. <doc>

4.<field name="id">1</field>

5.<field name="title">研究空格生命起源</field>

6. </doc>

7. </add>

启动 solr (solr.root=e:/apache-solr-1.4.1), 提交一个文档。

1. #启动 solr

2. cd solr.root/example

3. java -jar start.jar

4.

5. #提交索引

6. cd solr.root/example/exampledocs

7. java -jar post.jar doc-demo.xml

用两种方式查询:

1、extand lucene query parser 方式:查 研究生命起源

结果:

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

2. <response>

3.

4. <lst name="responseHeader">

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

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

7. <lst name="params">

8.<str name="debugQuery">on</str>

9.<str name="indent">on</str>

10. <str name="q">研究生命起源</str>

11. <str name="defType">extlucene</str>

12. </lst>

13.</lst>

14.<result name="response" numFound="1" start="0">

15. <doc>

16. <str name="id">1</str>

17. <str name="title">研究空格生命起源</str>

18. </doc>

19.</result>

20.<lst name="debug">

21. <str name="rawquerystring">研究生命起源</str>

22. <str name="querystring">研究生命起源</str>

23. <str name="parsedquery">+title:研究 +title:生命 +title:起源

</str>

24. <str name="parsedquery_toString">+title:研究 +title:生

命 +title:起源</str>

25. <str name="QParser">ExtLuceneQParser</str>

26.</lst>

27.</response>

2、用 solr 的默认 query parser 的查询,查 研究生命起源 结果:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值