添加elision过滤器到雪球

时间:2014-06-05 13:41:13

标签: ruby-on-rails elasticsearch stop-words snowball

起初,我使用的是分析器"语言分析器"一切似乎都很好。直到我意识到" a"不属于法语

中的停用词列表

所以我决定用雪球进行测试。它似乎也运作良好,但在这种情况下,它确实删除了像#34;升' "," d' ",...

因此我的问题:如何使用雪球,默认保留过滤器,并添加一个停用词和省略列表?

否则,如何更改分析器"语言分析器"?的停用词列表

最后一个问题:是否真的有兴趣使用雪球而不是分析器"语言分析器"?它更快吗?更相关?

谢谢

1 个答案:

答案 0 :(得分:1)

由于分析器只是一个标记器和零个或多个过滤器的组合,您可以构建自己的自定义雪球分析器,它模仿“默认值”并在顶部添加您自己的过滤器,例如{{3} }。

elision token filter中所述:

  

使用标准分类器的雪球类型分析器,标准过滤器小写过滤器停止过滤器,和雪球过滤器

所以这里有一个包含两种实现的示例,一个带有默认过滤器和自定义停用词和elision 的雪球分析器,以及一个带有自定义停用词列表的语言分析器

{
  "settings": {
    "analysis": {
      "analyzer": {
       "custom_snowball_analyzer": {
          "tokenizer": "standard",
          "filter": [
            "standard",
            "lowercase",
            "stop",
            "snowball",
            "custom_stop",
            "custom_elision"
          ]
        },
        "custom_language_analyzer": {
          "type": "french",
          "stopwords": ["a", "à", "t"]
        }
      },
      "filter": {
        "custom_stop": {
          "type": "stop",
          "stopwords": ["a", "à", "t"]
        },
        "custom_elision": {
          "type": "elision",
          "articles": ["l", "m", "t", "qu", "n", "s", "j"]
        }
      }
    }
  }
}

让我们看看两个分析仪产生的标记,使用相同的测试句子:

curl -sXGET 'http://localhost:9200/testing/_analyze?analyzer=custom_snowball_analyzer&pretty' -d "Il a de la chance, parait-t-il que l'amour est dans le pré, mais au final à quoi bon ?." | grep token
  "tokens" : [ {
    "token" : "il",
    "token" : "de",
    "token" : "la",
    "token" : "chanc",
    "token" : "parait",
    "token" : "il",
    "token" : "que",
    "token" : "amour",
    "token" : "est",
    "token" : "dan",
    "token" : "le",
    "token" : "pré",
    "token" : "mai",
    "token" : "au",
    "token" : "final",
    "token" : "quoi",
    "token" : "bon",

curl -sXGET 'http://localhost:9200/testing/_analyze?analyzer=custom_language_analyzer&pretty' -d "Il a de la chance, parait-t-il que l'amour est dans le pré, mais au final à quoi bon ?." | grep token
  "tokens" : [ {
    "token" : "il",
    "token" : "de",
    "token" : "la",
    "token" : "chanc",
    "token" : "parait",
    "token" : "il",
    "token" : "que",
    "token" : "amou",
    "token" : "est",
    "token" : "dan",
    "token" : "le",
    "token" : "pré",
    "token" : "mai",
    "token" : "au",
    "token" : "final",
    "token" : "quoi",
    "token" : "bon",

正如你所看到的,两个分析仪几乎产生完全相同的标记,除了“amour”,它还没有被阻止,我不知道为什么说实话,因为雪球过滤器在引擎盖下使用一个阻尼器。

关于你的第二个问题,那些过滤器只影响索引时间(在标记化步骤期间),我会说两个实现几乎都会执行(语言分析器应该稍快一点,因为它只会阻止这个例子中的法语单词) 除非您计划在重负荷下索引大量文档,否则不会引人注意。

搜索响应时间应该相似,因为令牌几乎相同(如果您仅索引法语文档),所以我认为Lucene将提供相同的性能。

总而言之,如果您只为法语文档编制索引,我会选择语言分析器,因为它在映射定义中要小得多: - )