Solr WordDelimiterFilter 生成单词部分并在查询中连接

标签 solr

我想查询 wi-fi 以将文档与索引中的 wifi 相匹配。所以,我使用 solr.WordDelimiterFilterFactory 来连接查询中的单词:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="1" splitOnCaseChange="1" splitOnNumerics="1" stemEnglishPossessive="0" preserveOriginal="0"/>
        <filter class="solr.ICUFoldingFilterFactory"/>
    </analyzer>
    <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="1" splitOnCaseChange="1" splitOnNumerics="1" stemEnglishPossessive="0" preserveOriginal="0"/>
        <filter class="solr.ICUFoldingFilterFactory"/>
    </analyzer>
</fieldType>

但是使用这个配置查询LGA1155并不匹配LGA 1155,因为查询title:LGA1155被解析为:(title:lga title:1155 title:lga1155)~3

如果我不连接查询中的单词,LGA1155 匹配 LGA 1155,因为查询被解析为:(title:lga title:1155)~2。但是 Wi-Fi 与 wifi 不匹配。

我正在使用 edismax 查询解析器,而 q.op 是 AND。 Solr 版本:4.5。

那么,如何让 wi-fi 匹配 wifi 和 LGA1155 匹配 LGA 1155(和其他类似的查询)?

最佳答案

正如您所描述的,您想将单词部分连接起来,但又想在数字上进行拆分。
catenateAll="1"你在那里不好,因为它会撤销你想要实现的数字分割(LGA115 变成 LGA 1155)。

尝试使用 WhitespaceTokenizerFactory 的这些设置在您的分析仪中。

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
    <analyzer>
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.WordDelimiterFilterFactory"
            generateWordParts="0" catenateWords="1"
            generateNumberParts="1" catenateNumbers="0" splitOnNumerics="1"
            catenateAll="0" splitOnCaseChange="0"
            stemEnglishPossessive="0" preserveOriginal="0" />
        <filter class="solr.ICUFoldingFilterFactory" />
    </analyzer>
</fieldType>

这将产生以下 token
  • 无线网络 -> wifi
  • Wi-Fi -> wifi
  • WiFi -> wifi
  • LGA1155 -> lga 1155
  • LGA 1155 -> lga 1155
  • LGA-1155 -> lga 1155

  • 如您所见,wifi 成为一个词,LGA1155 分离。

    另一件事是,正如您在我的示例中看到的,如果查询和索引时间的分析器应与您的示例中相同,则可以省略 type analyzer 中的属性元素并完全删除两个元素之一。

    所以代替

    <fieldType ... >
        <analyzer type="query">
           <!-- same stuff -->
        </analyzer>
        <analyzer type="index">
           <!-- same stuff -->
        </analyzer>
    </fieldType>
    

    只是

    <fieldType ... >
        <analyzer>
           <!-- will be taken to index and query time -->
        </analyzer>
    </fieldType>
    

    关于Solr WordDelimiterFilter 生成单词部分并在查询中连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19709304/

    相关文章:

    search - Solr高亮

    java - 如何在 Linux 上使用 plesk 为基于服务的 tomcat 版本设置 JAVA_OPTS?

    database - 分面搜索 : ElasticSearch/Solr or a simple database query?

    linux - 在 Azure 上使用 Bitnami Solr 创建核心目录

    solr - 太阳黑子和轮胎 gem 的区别

    solr - 如果 Caasandra 没有搜索功能,FaceBook 如何使用 Cassandra 进行收件箱搜索?

    c# - 如何在solrNet中查询

    java - 使用 SolR 的不同类型术语构建查询

    tomcat - 是否需要使用 servlet(Tomcat、Jetty 等)安装 solr?

    amazon-ec2 - AWS::CloudFormation::Init:安装后更新文件