solr搜索之solrJ语法(三)

简介:

1.1       solr语法

.基本查询

q  查询的关键字,此参数最为重要,例如,q=id:1,默认为q=*:*

fl  指定返回哪些字段,用逗号或空格分隔,注意:字段区分大小写,例如,fl= id,title,sort

start 返回结果的第几条记录开始,一般分页用,默认0开始

rows 指定返回结果最多有多少条记录,默认值为 10,配合start实现分页

sort 排序方式,例如id desc 表示按照id降序

wt (writer type)指定输出格式,有 xml, json, php

fq  filter query)过虑查询,提供一个可选的筛选器查询。返回在q查询符合结果中同时符合的fq条件的查询结果,例如:q=id:1&fq=sort:[1 TO 5],找关键字id的,并且sort15之间的。

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

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

indent  返回的结果是否缩进,默认关闭,用 indent=true|on 开启,一般调试json,php,phps,ruby输出才有必要用这个参数。

version  查询语法的版本,建议不使用它,由服务器指定默认值。

. Solr的检索运算符

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

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

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

  “~  表示模糊检索,如检索拼写类似于”roam”的项这样写:roam~将找到形如foamroams的单词;roam~0.8,检索返回相似度在0.8以上的记录。

AND||  布尔操作符

OR&&  布尔操作符

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

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

( )  用于构成子查询

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

{}  不包含范围检索,如检索某时间段记录,不包含头尾date:{201507 TO 201510}

 

高亮

h1  是否高亮,hl=true,表示采用高亮

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

hl.requireFieldMatch   如果置为true,除非用hl.fl指定了该字段,查询结果才会被高亮。它的默认值是false

hl.usePhraseHighlighter   如果一个查询中含有短语(引号框起来的)那么会保证一定要完全匹配短语的才会被高亮。

hl.highlightMultiTerm   如果使用通配符和模糊搜索,那么会确保与通配符匹配的term会高亮。默认为false,同时hl.usePhraseHighlighter要为true

hl.fragsize   返回的最大字符数。默认是100.如果为0,那么该字段不会被fragmented且整个字段的值会被返回。

分组

  官方wikihttp://wiki.apache.org/solr/SimpleFacetParameters#Facet_Fields_and_Facet_Queries

  这是facet的官方wiki,里面有facet各个参数的详细说明。所以这里只说一些常用的。

FacetSolr的核心搜索功能,主要是导航(Guided Navigation)、参数化查询(Paramatic Search)Facet的主要好处是在搜索的同时,可以按照Facet条件进行分组统计,给出导航信息,改善搜索体验。

Facet主要分为:Field Facet   Date Facet 两大类

1. Field Facet

facet 参数字段必须被索引

facet=on  facet=true

facet.field 分组的字段

facet.prefix  表示Facet字段前缀

facet.limit   Facet字段返回条数

facet.offict  开始条数,偏移量,它与facet.limit配合使用可以达到分页的效果

facet.mincount  Facet字段最小count,默认为0

facet.missing  如果为ontrue,那么将统计那些Facet字段值为null的记录

facet.sort 表示 Facet 字段值以哪种顺序返回 .格式为 true(count)|false(index,lex)true(count) 表示按照 count 值从大到小排列,false(index,lex) 表示按照字段值的自然顺序 (字母 , 数字的顺序 ) 排列 . 默认情况下为 true(count)

2. Date Facet

    对日期类型的字段进行 Facet. Solr 为日期字段提供了更为方便的查询统计方式 .注意 , Date Facet的字段类型必须是 DateField( 或其子类型 ). 需要注意的是 , 使用 Date Facet  , 字段名 , 起始时间 , 结束时间 , 时间间隔这 4 个参数都必须提供 .

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

facet.date.start 起始时间 , 时间的一般格式为 2015-12-31T23:59:59Z另外可以使用NOW,YEAR,MONTH等等 ,

facet.date.end  结束时间

facet.date.gap 时间间隔,如果 start  2015-1-1,end  2016-1-1gap 设置为+1MONTH表示间隔个月 , 那么将会把这段时间划分为 12 个间隔段 .

facet.date.hardend  表示 gap 迭代到 end 时,还剩余的一部分时间段,是否继续去下一个间隔取值可以为 true|false, 默认为 false.

    例 start  2015-1-1,end  2015-12-21,gap +1MONTH如果hardend  false,则,最后一个时间段为 2015-12-1  2016-1-1; 反之,如果 hardend  true,则,最后一个时间段为 2015-12-1  2015-12-21.

 

  注意:Facet的字段必须被索引,无需分词,无需存储。无需分词是因为该字段的值代表了一个整体概念,无需存储是因为一般而言用户所关心的并不是该字段的具体值,而是作为对查询结果进行分组的一种手段,给出相关的分组信息,从而改善搜索体验。

1.2    SolrJ查询语法总结

 

//AND 并且

    SolrQuery params = newSolrQuery("name:apple AND manu:inc");

   

    //OR 或者

    params.setQuery("name:apple ORmanu:apache");

    //空格等同于 OR

    params.setQuery("name:servermanu:dell");

   

    //params.setQuery("name:solr -manu:inc");

    //params.setQuery("name:server +manu:dell");

   

    //查询name包含solr apple

   params.setQuery("name:solr,apple");

    //manu不包含inc

    params.setQuery("name:solr,apple NOTmanu:inc");

   

    //50 <= price <= 200

    params.setQuery("price:[50 TO200]");

    params.setQuery("popularity:[5 TO6]");

    //params.setQuery("price:[50 TO 200] -popularity:[5 TO 6]");

    //params.setQuery("price:[50 TO 200] +popularity:[5 TO 6]");

   

    //50 <= price <= 200 AND 5 <=popularity <= 6

    params.setQuery("price:[50 TO 200] ANDpopularity:[5 TO 6]");

    params.setQuery("price:[50 TO 200] ORpopularity:[5 TO 6]");

   

    //过滤器查询,可以提高性能 filter 类似多个条件组合,如and

   //params.addFilterQuery("id:VA902B");

    //params.addFilterQuery("price:[50 TO200]");

    //params.addFilterQuery("popularity:[*TO 5]");

    //params.addFilterQuery("weight:*");

    //0 < popularity < 6  没有等于

    //params.addFilterQuery("popularity:{0TO 6}");

   

    //排序

    params.addSortField("id",ORDER.asc);

    //分页:start开始页,rows每页显示记录条数

    //params.add("start","0");

    //params.add("rows","200");

    //params.setStart(0);

    //params.setRows(200);

   

    //设置高亮

    params.setHighlight(true); // 开启高亮组件

   params.addHighlightField("name");// 高亮字段

    params.setHighlightSimplePre("<fontcolor='red'>");//标记,高亮关键字前缀

    params.setHighlightSimplePost("</font>");//后缀

    params.setHighlightSnippets(1);//结果分片数,默认为1

    params.setHighlightFragsize(1000);//每个分片的最大长度,默认为100

 

    //分片信息

    params.setFacet(true)

        .setFacetMinCount(1)

        .setFacetLimit(5)//

        .addFacetField("name")//分片字段

        .addFacetField("inStock");

   

    //params.setQueryType("");



本文转自 wyait 51CTO博客,原文链接:http://blog.51cto.com/wyait/1945902,如需转载请自行联系原作者

相关文章
|
5月前
|
缓存 监控 负载均衡
使用Apache Solr进行搜索优化的技术探索
【6月更文挑战第6天】探索Apache Solr搜索优化,通过字段选择、分析器优化、索引压缩提升索引效率;优化查询分析、缓存、分组排序以增强查询性能;硬件升级、分布式部署及监控调优保证系统稳定性。实战案例展示如何在电商平台上应用这些策略,实现快速准确的搜索服务。Solr在大数据时代展现出广阔的应用潜力。
|
6月前
|
JSON 前端开发 API
【Elasticsearch】搜索结果处理和RestClient查询文档
【Elasticsearch】搜索结果处理和RestClient查询文档
416 0
|
JSON 前端开发 JavaScript
【Elasticsearch】搜索结果处理和RestClient查询文档(上)
【Elasticsearch】搜索结果处理和RestClient查询文档
132 0
|
JSON Java API
【Elasticsearch】搜索结果处理和RestClient查询文档(下)
【Elasticsearch】搜索结果处理和RestClient查询文档
489 0
|
Java Maven 索引
Spring整合solr实现文章的添加与搜索
Spring整合solr实现文章的添加与搜索
100 0
|
Java Spring
spring data solr实现关键字搜索+高亮显示+分组查询
spring data solr实现关键字搜索+高亮显示+分组查询
273 0
spring data solr实现关键字搜索+高亮显示+分组查询
|
Apache 数据格式 算法
|
SQL 自然语言处理 Java
Solrflux源码分析-Sql Support within Solr-类Sql的solr搜索实现(2)
假期重新把之前在新浪博客里面的文字梳理了下,搬到这里。
100 0
Solrflux源码分析-Sql Support within Solr-类Sql的solr搜索实现(2)
|
自然语言处理
Solr BooleanQuery AND phraseQuery用法比较
假期重新把之前在新浪博客里面的文字梳理了下,搬到这里。 本文Solr BooleanQuery 与PhraseQuery 用法比较。主要内容理解布尔查询、短语查询在分词后,AND OR 关系,帮助理解查询语义,和对结果的影响。顺便温习3种实现形式。
212 0
|
自然语言处理 索引
solr长文本搜索问题
假期重新把之前在新浪博客里面的文字梳理了下,搬到这里
276 0