Solr dismax行为 - 标点符号和空格分裂

时间:2014-09-22 16:44:44

标签: solr lucene punctuation edismax dismax

我有一个Solr 4.7.0实例,索引中有200 000个文档(文件系统上每个文件一个文档),由多个用户使用。文档由关键字标识,索引并存储在名为" signature_1"的一个字段中。 在索引期间,我删除了我用空格替换的所有类型的标点符号(感谢ScriptUpdateProcessor),因此我的关键字用空格分隔,分别在字段signature_1(fieldtype signature)的索引和存储部分中。

<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="lang\stopwords_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="lang\stopwords_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在文档的关键字之间进行搜索,删除标点符号。

上面的示例运作良好,但在某些情况下,它不能以这种方式工作。查询

  

A B-C

Dismax在

中拆分查询
  

(+(DisjunctionMaxQuery((signature_1:a))DisjunctionMaxQuery((signature_1:&#34; b c&#34;)))())/ no_coord

这会弄乱我的结果的相关性(即顺序)。我尝试使用autoGeneratePhraseQueries =&#34; True&#34;但没有效果。

所以我希望Dismax总是在空白和标点符号上分开或永远不会这样做(结果将是相同的)。知道如何设法做到这一点(不必创建我的Java Dismax类)?

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

2 个答案:

答案 0 :(得分:0)

我不清楚您是希望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"

答案 1 :(得分:0)

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

但是你需要Velocity这个解决方案,如果你使用没有速度的请求处理程序(或者更普遍的HTML界面),它就无法工作。