精华内容
下载资源
问答
  • Solr查询

    千次阅读 2017-12-06 09:32:35
    篇一:solr查询需求转换 solr查询需求转换 Solr的检索运算符 1. “:” 指定字段查指定值,如返回所有值*:* 2. “?” 表示单个任意字符的通配 3. “*” 表示多个任意字符的通配(不能在检索的项开始使用*或者?...

    篇一: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 的查询,查 研究生命起源 结果:


    展开全文
  • Solr 查询

    2019-08-16 15:12:40
    2:定义solr: private static ISolrReadOnlyOperations<HotelInfoSolr> solr; 这里的HotelInfoSolr是返回solr的实体对象。 3:创建solr返回实体对象 需要如下定义: public class HotelInfoSolr { ....

    1:需要添加dll引用:SolrNet;

    2:定义solr:   

      private static ISolrReadOnlyOperations<HotelInfoSolr> solr;

    这里的HotelInfoSolr是返回solr的实体对象。

    3:创建solr返回实体对象

    需要如下定义:

        public class HotelInfoSolr
        { 

    /// <summary>
            /// 酒店编号
            /// </summary>
            [SolrUniqueKey("id")]
            public string HotelCode { get; set; }
            /// <summary>
            /// 酒店名称
            /// </summary>
            [SolrField("HotelName_s")]
            public string HotelName { get; set; }
            /// <summary>
            /// 酒店名称英文
            /// </summary>
            [SolrField("HotelNameen_s")]
            public string HotelNameen { get; set; }

            /// <summary>
            /// 酒店名称英文
            /// </summary>
            [SolrField("HotelAddress_s")]
            public string HotelAddress { get; set; }

            /// <summary>
            /// 百度坐标
            /// </summary>
            [SolrField("BmapPoint_p")]
            public string BmapPoint { get; set; }
            /// <summary>
            /// 谷歌坐标
            /// </summary>
            [SolrField("GmapPoint_p")]
            public string GmapPoint { get; set; }

    }

    4:实例化solr

    这里必须有2,先定义,再实例化

     solr = ServiceLocator.Current.GetInstance<ISolrOperations<HotelInfoSolr>>();

    5:solr查询语句:

    下面是solr的查询语句,需要两个查出  query  跟queryOptions

          var matchingHotelList = solr.Query(query, queryOptions);

    matchingHotelList 就是solr查询后返回的对象

    定义参数:queryOptions

     var queryOptions = new QueryOptions
                {
                    Rows = (IsForMap && MapList) ? 9999 : parameters.PageSize,
                    Start = start,
                    //  OrderBy = GetSelectedSort(sortStr),
                    Fields = fieldList,
                    SpellCheck = new SpellCheckingParameters()
                };

     

     

    实例化定义后,需要给下面的一下属性赋值,

     var start = (startIndex - 1) * parameters.PageSize;  页面开始页

    Fields 是返回字段。下面是实例化具体返回字段

     List<string> fieldList = new List<string>();

                //查询输出字段 列表
                fieldList.Add("id");
                fieldList.Add("GmapPoint_p");
                fieldList.Add("BmapPoint_p");
                fieldList.Add("hotelPointTotal_d");

     queryOptions.OrderBy   可以排序

       List<SortOrder> orderList = new List<SortOrder>();
                    orderList.Add(SortOrder.Parse(sortStr1));
                    orderList.Add(SortOrder.Parse(sortStr));
                    queryOptions.OrderBy = orderList.ToArray();

     

    query 参数

    定义参数   

           var query = BuildQuery(parameters);

    方法定义:

      private ISolrQuery BuildQuery(SearchParameters parameters)
            {

      var queryStr = "(BusinessFlag_s:(T OR I OR S ) OR (BusinessFlag_s:(V) AND openDate_d:[1 TO " + startDate + "]))";

      var query = new SolrQuery(queryStr);

                return query;

    }

     

     

     

     

     

    展开全文
  • solr查询

    2018-11-20 14:46:01
    1.solr服务器中 根据关键字 高亮分页查询(目的伙子查询结果在页面显示)根据关键字,分组查询分类,目的是得到根据关键字匹配到的所有分类,分组的目的是将重复的分类去掉。 在后台管理系统中在维护模板数据的时候...

    在html查询列表中输入关键字
    页面需要规格,分类,品牌还有结果集

    1.solr服务器中
    根据关键字 高亮分页查询(目的伙子查询结果在页面显示)根据关键字,分组查询分类,目的是得到根据关键字匹配到的所有分类,分组的目的是将重复的分类去掉。
    在后台管理系统中在维护模板数据的时候讲模板数据存入redis中进行缓存
    数据格式
    key value(是map格式)
    brandList 模板ID 品牌集合
    specList 模板id 规格集合数据包含规格选项

    在分类维护界面数据的时候可以将分类和对应的的模板缓存到redis中
    key value(是map格式)
    category 分类名称 模板ID

    2.根据分类名称到redis中查询对应的模板id

    3.根据模板id到redis中查询品牌集合数据

    4.根据模板id到redis中查询规格集合数据

    5.在页面上展示这些数据,如果鼠标点击具体的品牌或者贵和或者分类的时候那么点击的内容就是作为过滤的条件,根据这些过滤的条件再次进行过滤返回页面结果

    排序
    价格排序:一般价格传导后台都是0-500这类的字符串,先切割,在判断速度第一个是否等于0,不等于0则大于等于第一个数,在判断熟读第二位是否等于*,不等则小于等于第二个数。
    评价排序:给评价设置分值,把原始评论放在mengoudb中,分值放在solr中,分值每天统计一次,分值多少直接在数据库中储存但是不能每次都去数据库中差
    是否新品:按照物品上加时间三个月内都算新品
    销量:在redis中计算,在数据中有储存和solr中斗鱼储存;

    展开全文
  • solr查询语法

    2018-11-10 09:35:24
    solr查询语法,solr常用查询语法汇总。
  • solr 查询

    2012-11-09 16:55:41
    关键字中有空格如:x x 怎么设置使查询的结果包含 abx xff;xfax...等等之类的
  • 这里先列出solr查询所需要的参数一.基本查询q 查询的关键字,此参数最为重要,例如,q=id:1,默认为q=*:*,fl 指定返回哪些字段,用逗号或空格分隔,注意:字段区分大小写,例如,fl= id,title,sortstart 返回结果的...

    主要还是总结Solr 的查询参数,还是那句话,只有先明白了solr的基础内容和查询语法,后续学习solr 的C#和数据库操作,都是水到渠成的事。这里先列出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为1 的,并且sort是1到5之间的。

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

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

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

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

    二. Solr的检索运算符

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

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

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

    “~”  表示模糊检索,如检索拼写类似于”roam”的项这样写:roam~将找到形如foam和roams的单词;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且整个字段的值会被返回。

    四. 分组

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

    Facet是Solr的核心搜索功能,主要是导航(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  如果为on或true,那么将统计那些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-1,gap 设置为 ”+1MONTH” 表示间隔1 个月 , 那么将会把这段时间划分为 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的字段必须被索引,无需分词,无需存储。无需分词是因为该字段的值代表了一个整体概念,无需存储是因为一般而言用户所关心的并不是该字段的具体值,而是作为对查询结果进行分组的一种手段,给出相关的分组信息,从而改善搜索体验。

    展开全文
  • solr 查询应用

    2012-03-01 14:45:28
    solr 查询应用solr 查询应用
  • Solr 查询语法

    2019-09-12 22:48:21
    由于 Solr 内部实现查询语句的语法语义分析使用比较成熟的工具 Javacc,所以 Solr 支持的查询语法还是很丰富的,Solr 查询语法可以总结如下: Solr 查询无论是 Solrj 操作还是直接发送请求给 Solr 服务器,原理都是...
  • 一、封装的查询方法/*** solr查询方法* @param client solr客户端* @param query solr查询对象* @return list集合* @throws SolrServerException* @throws IOException*/public static List> getSolrQuery...
  • Solr查询详解

    千次阅读 2017-01-11 11:08:36
    Solr查询详解
  • 一、封装的查询方法/*** solr查询方法* @param client solr客户端* @param query solr查询对象* @return list集合* @throws SolrServerException* @throws IOException*/public static List> getSolrQuery...
  • Solr查询数据

    千次阅读 2018-07-29 10:21:31
    solr查询参数】 Apache Solr还提供了一些在需要时查询数据的功能。 Solr提供了一些参数,可以使用它们来在查询存储的数据。 在下表中,我们列出了Apache Solr中提供的各种常用的一些查询参数。 您可以查看...
  • SolrQuery类是实现solr查询的类。@Testpublic void testSelect() {String url = "http://localhost:8081/solr/solrcore";SolrClient client = new HttpSolrClient.Builder(url).build();SolrQuery query = new ...
  • 一、封装的查询方法/*** solr查询方法* @param client solr客户端* @param query solr查询对象* @return list集合* @throws SolrServerException* @throws IOException*/public static List> getSolrQuery...
  • Solr查询参数说明

    万次阅读 2017-07-25 21:40:02
    Solr查询参数说明: http://localhost:8983/solr/solr_select/query?q=*:*&fl=id 参数说明如下: q – 查询字符串,必须的。Solr 中用来搜索的查询。有关该语法的完整描述,请参阅 参考资料 中
  • solrquery类是实现solr查询的类。@testpublic void testselect() {string url = "http://localhost:8081/solr/solrcore";solrclient client = new httpsolrclient.builder(url).build();solrquery query = new ...
  • Solr查询参数

    2016-11-22 14:28:00
    今天还是不会涉及到.Net和数据库操作,主要还是总结...这里先列出solr查询所需要的参数  wiki 地址:http://wiki.apache.org/solr/FrontPage, 里面有各个参数详细的介绍。    一.基本查询  q 查询的关键...
  • 或者是访问已经放在服务器上的solr环境,例如http://10.2.28.124:8080/solr/index.html,然后选择core(在我项目里目前只有一个node即mynode),进行查询。例如下图:查询主要的如下面这张网络上的图:(来源:...
  • [Java教程]java实现简单的solr查询02018-09-29 11:00:40SolrQuery类是实现solr查询的类。@Test public void testSelect() { String url = "http://localhost:8081/solr/solrcore"; SolrClient client = new ...
  • Solr查询处理简介

    2018-05-30 13:05:19
    一、Solr的查询表单详解 二、Solr的搜索返回机制 三、排名检索 四、分页和排序 分页 排序 五、拓展的搜索功能 一、Solr的查询表单详解 Solr管理控制台的查询表单 ... Solr查询表单的所有参数 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,327
精华内容 2,130
关键字:

solr查询