Solr dismax行为-标点符号和空白分割



我有一个Solr 4.7.0实例,索引中有200000个文档(文件系统上每个文件一个文档),供几个用户使用。文档由关键字标识,这些关键字被编入索引并存储在一个名为"signature_1"的字段中。在索引过程中,我删除了所有用空格替换的标点符号类型(多亏了ScriptUpdateProcessor),因此我的关键字在索引和字段signature_1(字段类型签名)的存储部分都用空格分隔。

<fieldType name="signature" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
  <analyzer type="index">
    <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([^a-zA-Z0-9éèàùêâûôîäëöüï])" replacement=" "/>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LimitTokenCountFilterFactory" maxTokenCount="1000" consumeAllTokens="false"/>
    <filter class="solr.ASCIIFoldingFilterFactory"/>
    <!--<filter class="solr.StopFilterFactory" ignoreCase="true" words="langstopwords_fr.txt" enablePositionIncrements="true" />-->
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms_chantiers.txt" ignoreCase="true" expand="false"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms_chantiers_secteurs.txt" ignoreCase="true" expand="false"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SnowballPorterFilterFactory" language="French" />
  </analyzer>
  <analyzer type="query">
    <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([^a-zA-Z0-9éèàùêâûôîäëöüï])" replacement=" "/>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.ASCIIFoldingFilterFactory"/>
    <!--<filter class="solr.StopFilterFactory" ignoreCase="true" words="langstopwords_fr.txt" enablePositionIncrements="true" />-->
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms_chantiers.txt" ignoreCase="true" expand="false"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SnowballPorterFilterFactory" language="French" />
  </analyzer>
</fieldType>

我希望在查询期间有同样的行为:如果有人搜索

A-B-C

我希望Solr进行以下搜索(使用OR运算符,dismax):

A B C

所以基本上,我只是想让Solr在文档的关键词之间搜索,去掉标点符号。

上面的例子工作得很好,但在某些情况下,它不是这样工作的。带查询

B-C

Dismax在中拆分查询

(+(DisjunctionMaxQuery((signature_1:a))DisjunctionMaxQuery((signature_1:"bc"))())/no_coord

这会打乱我的结果的相关性(即顺序)。我尝试使用autoGeneratePraseQueries="True",但没有效果。

所以我希望Dismax总是在空白和标点符号上进行拆分,或者永远不要这样做(结果会是一样的)。你知道我如何做到这一点(而不必创建Java Dismax类)吗?

以下帖子与我的问题有关:

  • SOLR生成关于标点符号的短语查询
  • Solr Dismax处理程序-空白和特殊字符行为

我不太清楚您是希望A B-C是一个短语查询("A B C")还是三个单独的术语查询(A B C),但是:

如果你想让它成为一个短语查询,只需用引号括起来:"A B-C"

如果你想单独搜索每个词条,只需自己删除标点符号,留下A B C

查询解析器通常在空格处而不是标点处分隔查询子句。这与分析无关,它只是查询解析器语法。因此,对于A B-C,您将得到两个查询子句,AB-C。当分析开始时,B-C被拆分为两个术语,因此查询解析器将其作为短语查询而不是术语查询,最终结果看起来像A "B C"

我终于找到了一个解决方案,它有点"快速而肮脏",但它正在工作:在Velocity中,我创建了一个Javascript函数来编辑q字段,这个函数是使用GET表单的参数onsubmit调用的(它在stackoverflow.com/questions/576305/edit-value-of-a-html-input-form-by-Javascript中描述)。

但是,对于这个解决方案,您需要Velocity,如果您使用的是没有Velocity的请求处理程序(或者更常见的是HTML接口),它就不起作用。

最新更新