solr 使用自定义的 QueryParser

2019-03-27 01:02|来源: 网路

如果想让 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=solr&start=0&rows=10&fl=*%2Cscore&debugQuery=on


转自:http://www.cnblogs.com/wycg1984/archive/2009/09/16/1567654

相关问答

更多
  • 是的 ,lucene查询允许在查询中使用括号,并且您提供的语法完全有效。 但是, 不 ,这两个查询不会得到相同的结果。 这不是一些Lucene怪癖,但这两个查询在逻辑上并不相同。 根据德摩根定律 :不是一个而不是一个=不是(一个或多个) field1:val1 NOT field2:val2 NOT field3:val3等效于field1:val1 NOT (field2:val2 OR field3:val3) 。 这些将返回包含“val1”的结果,但不包含“val2”或“val3” field1:va ...
  • 您可以使用类似于http://wiki.apache.org/solr/DataImportHandlerDeltaQueryViaFullImport中提到的方法。 然后,您在data-config.xml中的查询将是
    您可以尝试使用hl.fragsize=100和hl.mergeContiguous=false并查看您获得了多少片段? (在solrconfig.xml中直接在SearchHandler中添加params之前,您可以通过在查询中指定所有参数来尝试各种选项。一旦找到一组您满意的参数,请在solrconfig中使用它们。) Can you try with hl.fragsize=100 and hl.mergeContiguous=false and see how many fragments you ge ...
  • 我有点困惑。 这听起来像是在问你是否可以使用QueryParser来完成它的设计目的...... 对于一些解释,分析器在必要时在文本中查找术语, StandardAnalyzer是一个很好的起点。 默认字段就是这样,当您没有为术语提供字段时,它会使用此处传递的字段。 查询语法docs中介绍了没有指定字段的搜索项的情况。 这是QueryParser的一个相当典型的用法: Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43); QueryPars ...
  • 如果您只对某些内容完全匹配感兴趣,请使用StrField (StrField区分大小写,因此案例也必须匹配)。 由于您只能获得完全匹配,所有文档的评分都是相同的。 您需要实现自定义相似性类的唯一时间是,您希望以与内置相似性(或函数查询)允许的方式不同的方式对文档进行评分。 完全匹配将是一个常规查询: city:Frankfurt 。 只要该字段是一个StrField,那么只会返回该字段中具有完全Frankfurt文档的文档(除非您为其中一个文档添加了索引时间提升,否则它们的得分都相同)。 此外,如果您按字段 ...
  • moneyTo是数字领域吗? 如果是这样,您应该使用NumericRangeQuery而不是TermRangeQuery。 如果moneyTo是一个字符串字段,它看起来不像TermRangeQuery将“*”识别为开放端点,您应该使用null 。 Is moneyTo a numeric field? If so, you should use NumericRangeQuery instead of TermRangeQuery. If moneyTo is a string field, it does ...
  • 不,他们不是相同的。 以下是每个人的个人描述。 1)QueryParser “解析”文本查询并构建Lucene-Query-Object。 它接受文本查询并基于该信息构建Lucene Query对象。 查看本文 ,它描述了QueryParser解析文本输入并构建相应Query对象的方式。 2) TermQuery是QueryParser的可交付成果 ,即它是一种Lucene Query。 Lucene支持各种查询,如布尔查询,模糊查询等.TermQuery是Lucene查询的最基本形式。 什么时候用? 几乎 ...
  • 根据https://wiki.apache.org/solr/MoreLikeThisHandler,MoreLikeThisHandler支持CommonQueryParameters。 这意味着您应该能够在搜索中添加fq (过滤器查询)参数,并在f2之间过滤某些内容和其他内容。 例如: fq=f2:["2011-03-21" TO "2012-03-21"] 这说,找到MLT的所有结果,然后添加此过滤查询。 According to https://wiki.apache.org/solr/MoreL ...
  • 要获取Sitecore索引,请使用ContentSearchManager类中的GetIndex方法: Sitecore.ContentSearch.ContentSearchManager.GetIndex(...) 您可以传递索引名称: // get Sitecore built in index for current database: string dbName = (Sitecore.Context.ContentDatabase ?? Sitecore.Context.Database).N ...
  • 您可以使用DocTransformer实现此目的。 只需从类继承并在transform方法中实现所需的逻辑: public void transform(SolrDocument doc, int docId) { String oldValue = doc.getFieldValue(fieldName); doc.put(newField,getNewValue(oldValue)); } You can achieve this using a DocTransformer . Ju ...