【问题标题】:Solr dismax behaviour - punctuation and white space splittingSolr dismax 行为 - 标点符号和空格分割
【发布时间】:2014-11-16 17:11:19
【问题描述】:

我有一个 Solr 4.7.0 实例,索引中有 200 000 个文档(文件系统上每个文件一个文档),供多个用户使用。文档由关键字标识,这些关键字被索引并存储在一个名为“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="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:"b c"))) ())/no_coord

这弄乱了我的结果的相关性(即顺序)。我尝试使用 autoGeneratePhraseQueries="True" 但没有效果。

所以我希望 Dismax 始终在空格和标点符号上进行拆分,或者永远不要这样做(结果将是相同的)。知道如何做到这一点(无需创建我的 Java Dismax 类)吗?

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

【问题讨论】:

    标签: solr lucene punctuation edismax dismax


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。我不希望 A B-C 成为短语查询,我想要 3 个单独的术语查询。我编辑了我的评论以反映我不是唯一用户的事实,因此您的解决方案对我不起作用,我不想要求用户删除他们请求中的标点符号(也因为某些查询将使用复制/包含标点符号的事物的过去)。
    • 我更多地考虑通过一些逻辑来规范化搜索文本,而不是培训用户。
    • 什么样的逻辑?我正在使用速度模板,查询直接从网页中表单元素的文本区域到 Solr 的 DisjunctionMaxQuery(如果我错了,请纠正我)。我将在哪里实现这样的逻辑?
    【解决方案2】:

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

    但是你需要 Velocity 来实现这个解决方案,如果你使用没有速度的请求处理程序(或者更一般的 HTML 接口),它就不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      相关资源
      最近更新 更多