Searchkick - 尾随特殊字符

时间:2017-01-17 08:44:13

标签: ruby-on-rails elasticsearch searchkick

我在Rails 5 app上使用Searchkich。

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

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

但是,如果点(或其他特殊字符)在尾随(即66.66-或甚至66.---.-.---),则其行为类似于查询字符串66。看起来好像"正常"正在修剪字符(字母和数字)。

我的搜索结果如下:

Part.search "66.", fields: [:catalogue_number], misspellings: false, match: :word_start

可能的解决办法是什么?

修改

好吧,我把它分解了,点和连字符似乎是两个不同的问题。

  1. 查询字符串中的点似乎表现如上所述 - 如果点后跟任何"正常"字符搜索按预期工作。然而,尾随点似乎被忽略了。
  2. 查询字符串中间的连字符表现得像空格一样 - 它们将查询字符串分成不同的字符串(之后与运算符and连接)。尾随连字符似乎被忽略(如点)。
  3. 我需要的是点和连字符在字面上表现在查询字符串中的任何位置。

1 个答案:

答案 0 :(得分:4)

searchkick的word_start分析器使用此ES配置(source here

searchkick_word_start_index: {
    type: "custom",
    tokenizer: "standard",
    filter: ["lowercase", "asciifolding", "searchkick_edge_ngram"]
}

它使用标准令牌生成器在连字符和点上分割字符串(标准令牌生成器使用其他规则,但与您的情况无关)(doc here

您应该尝试使用这种配置的搜索text_start匹配项

searchkick_text_start_index: {
    type: "custom",
    tokenizer: "keyword",
    filter: ["lowercase", "asciifolding", "searchkick_edge_ngram"]
}

Elastic关键字标记生成器将保留“。”和“-”,并且应适合您的用例。

NB:有人认为66.6上的有效匹配是a幸的,因为标准分析器还会去除“。”。