Searchkick-尾随特殊字符

gli*_*101 5 ruby-on-rails elasticsearch searchkick

我正在使用Searchkich on Rails 5应用程序。

在模型的search_data中,Part我具有包含点(.)和连字符(-)的字符串字段。我想使用查询字符串中的点和连字符对这些字段进行文字搜索。我正在使用word_start火柴。

当我的查询字符串看起来像这样时:66.6它可以正常工作(它会找到带有以开头的查询字段的所有记录66.6)。

但是,如果点(或其他特殊字符)结尾(即66.or 66-或什至66.---.-.---),则其行为类似于查询字符串is just 66。修整了“正常”字符(字母和数字)后,似乎一切正常。

我的搜索如下所示:

Part.search "66.", fields: [:catalogue_number], misspellings: false, match: :word_start
Run Code Online (Sandbox Code Playgroud)

有什么可能的解决方案?

编辑:

好的,我把它分解了,似乎圆点和连字符是两个独立的问题。

  1. 查询字符串中的点似乎具有如上所述的行为-如果点后跟任何“常规”字符搜索,则按预期方式工作。但是尾随点似乎被忽略了。
  2. 查询字符串中间的连字符的行为类似于空格-它们将查询字符串划分为不同的字符串(随后与operator相连and)。尾部的连字符似乎被忽略了(像点一样)。

我需要的是点和连字符都可以在查询字符串中的任何地方按字面上的方式运行。

Pie*_*let 5

searchkick 的 word_start 分析器使用这个 ES 配置(来源在这里

searchkick_word_start_index: {
    type: "custom",
    tokenizer: "standard",
    filter: ["lowercase", "asciifolding", "searchkick_edge_ngram"]
}
Run Code Online (Sandbox Code Playgroud)

它使用标准分词器在连字符和点上分割字符串(标准分词器使用了其他规则,但与您的情况无关)(此处为文档

您应该尝试text_start使用此配置的 searchkick 匹配

searchkick_text_start_index: {
    type: "custom",
    tokenizer: "keyword",
    filter: ["lowercase", "asciifolding", "searchkick_edge_ngram"]
}
Run Code Online (Sandbox Code Playgroud)

Elastic 关键字标记器将保留“.”。和“-”,应该适用于您的用例。

注意:A 认为工作匹配66.6是侥幸,因为标准分析器也去掉了“。”