solr实质上是基于Lucence的搜索套装,所有的搜索/索引 能力都来着Lucence,solr干的都是打杂的活。关于query syntax是solr 主要工作之一

参考

一般来说,solr的搜索url是这样的: http://127.0.0.1:8983/solr/core1/select?q=xxx:yyy, FieldName:Value成对出现的形式

看了solr的源代码才知道,上面这种查询语法被称为 Lucence 格式查询,其实是一种特殊查询语法,由org.apache.solr.search.LuceneQParser 提供实现,这部分代码是用javacc 生成的,及其“好看”

正常的solr 查询语法是这样的:

q={!查询类型 param1=value1 param2=value2 ...}keyword or q=keyword&defType=查询类型

solr支持的查询类型有18种

public static final Object[] standardPlugins = {
    LuceneQParserPlugin.NAME, LuceneQParserPlugin.class,
    OldLuceneQParserPlugin.NAME, OldLuceneQParserPlugin.class,
    FunctionQParserPlugin.NAME, FunctionQParserPlugin.class,
    PrefixQParserPlugin.NAME, PrefixQParserPlugin.class,
    BoostQParserPlugin.NAME, BoostQParserPlugin.class,
    DisMaxQParserPlugin.NAME, DisMaxQParserPlugin.class,
    ExtendedDismaxQParserPlugin.NAME, ExtendedDismaxQParserPlugin.class,
    FieldQParserPlugin.NAME, FieldQParserPlugin.class,
    RawQParserPlugin.NAME, RawQParserPlugin.class,
    TermQParserPlugin.NAME, TermQParserPlugin.class,
    NestedQParserPlugin.NAME, NestedQParserPlugin.class,
    FunctionRangeQParserPlugin.NAME, FunctionRangeQParserPlugin.class,
    SpatialFilterQParserPlugin.NAME, SpatialFilterQParserPlugin.class,
    SpatialBoxQParserPlugin.NAME, SpatialBoxQParserPlugin.class,
    JoinQParserPlugin.NAME, JoinQParserPlugin.class,
    SurroundQParserPlugin.NAME, SurroundQParserPlugin.class,
    SwitchQParserPlugin.NAME, SwitchQParserPlugin.class,
    MaxScoreQParserPlugin.NAME, MaxScoreQParserPlugin.class

};

一般应用不需要研究这个,除非需要基于solr做二次开发。solr对查询实现采用Plugin机制,一个萝卜一个坑,如果需要自己定义查询方式,步骤如下:

  1. 继承QParserPlugin写好plugin之后,打包成jar
  2. 让solr加载这个jar包
  3. 在solrconfig.xml中填入定义:<queryParser name="myparser" class="com.lutaf.search.solr.PayloadTermQueryPlugin"/>

同时使用多种查询

这种查询方法叫做 Nest Query,很简单 ,用 AND (全部大写) _query_ 把另外一种query 方式串联起来就行

text:"roses are red" AND _query_:"type:poems"

参考:http://searchhub.org//2009/03/31/nested-queries-in-solr/

本文地址: http://lutaf.com/199.htm 鲁塔弗原创文章,欢迎转载,请附带原文链接