【问题标题】:elasticsearch edge n-gram tokenizer: include symbols in the tokenselasticsearch edge n-gram tokenizer:在标记中包含符号
【发布时间】:2020-01-03 11:45:07
【问题描述】:

我正在使用基于 Edge NGram 标记器的自定义标记器,并且我希望能够搜索“sport+”之类的字符串,即我希望将特殊符号(例如 + 号)视为一部分令牌。

例如,我们有包含以下字段的文档:

"typeName": "LC 500h Sport+ CVT" 或者 "typeName": "LC 500h Sport CVT".

使用以下子句执行查询:

{
  "match": {
    "typeName": {
      "query": "sport+ cvt",
        "operator": "and"
    }
  }
}

获取两个文档。但是,在这种情况下,我们只希望返回带有 "typeName": "LC 500h Sport+ CVT" 的文档。

我们一直在分词器设置中使用以下 token_chars 类:digitletterpunctuation。我认为将 symbol 添加为 token_chars 类并重新创建索引可以解决问题,但它没有帮助。

编辑: 这是 Nest 语法中的分析器定义:

Settings(s => s
    .Analysis(_ =>
        _.Analyzers(a => a
                .Custom(
                    "vehicleanalyzer",
                    descriptor => descriptor
                        .Tokenizer(vehicleEdgeNgram)
                        .Filters("lowercase"))
                  .Standard("vehiclesearch",
                  descriptor => descriptor))
            .Tokenizers(descriptor => descriptor
                .EdgeNGram(
                    vehicleEdgeNgram,
                    tokenizerDescriptor =>
                        tokenizerDescriptor
                            .MinGram(1)
                            .MaxGram(10)
                            .TokenChars(
                                TokenChar.Digit,
                                TokenChar.Letter,
                                TokenChar.Punctuation,
                                TokenChar.Symbol)))))

【问题讨论】:

  • 能否分享您的分析仪定义?
  • @Lupanoide 我在 Nest 语法中添加了分析器定义,因为这是我们实际创建它的方式。谢谢!

标签: elasticsearch nest


【解决方案1】:

documentation 中所写的 token_chars 是:

应包含在令牌中的字符类。弹性搜索 将拆分不属于指定类的字符。 默认为 [](保留所有字符)。

默认情况下,elasticsearch 保留所有字符。仅当您希望倒排索引中的字符类别较少时,才应使用此选项。因此,要解决您的问题,您应该简单地删除 token_chars 的定义:您的标记器将保留所有字符

【讨论】:

  • 那会处理空白吗? whitespace 也是一个有效的 token_chars 类,但我们不希望空白字符包含在令牌中。
  • 我尝试在未指定 token_chars 的情况下重新创建索引。分析器确实可以正确处理空格。但是,最初的问题仍然存在:对sport+ cvt 的查询会同时找到Sport+ CVTSport CVT
  • @Developer 好的。当您进行匹配查询时,查询也会被标记化,因此弹性地将vehicleTokenization应用于sport+并找到sport。也许您应该尝试使用 match_phrase 查询
  • 不幸的是,match_phrase 存在同样的问题 :( 此外,match_phrase 似乎不满足其他一些要求,例如,对于像 lc cvt 这样的查询,它不会产生任何结果,因为 @987654331 @ 和 CVT 在搜索到的文档中不相邻。
  • 你是对的,在这种情况下,你应该强制在查询时间使用另一个分析器 - 例如标准。它将标记空格。然后你应该实现 search_analyzer 。请在此处阅读解释 edgengram 和 search_analyzer elastic.co/guide/en/elasticsearch/reference/current/… 的部分
猜你喜欢
  • 2021-01-24
  • 2021-03-18
  • 2019-04-13
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 2021-09-22
  • 1970-01-01
相关资源
最近更新 更多