【问题标题】:elasticsearch tokenize "H&R Blocks" as "H", "R", "H&R", "Blocks"elasticsearch 将“H&R Blocks”标记为“H”、“R”、“H&R”、“Blocks”
【发布时间】:2013-08-14 04:14:48
【问题描述】:

我想保留标记中的特殊字符,同时仍然标记特殊字符。说我有这个词

"H&R Blocks"

我想把它标记为

"H", "R", "H&R", "Blocks"

我读了这篇文章http://www.fullscale.co/blog/2013/03/04/preserving_specific_characters_during_tokenizing_in_elasticsearch.html。它解释了如何保留特殊字符。

【问题讨论】:

    标签: elasticsearch token tokenize


    【解决方案1】:

    尝试使用word_delimiter 令牌过滤器。

    Reading the docs on its use 你可以设置参数preserve_original: true 来做你想做的事(即“H&R” => H&R H R)。

    我会这样设置:

    "settings" : {
        "analysis" : {
            "filter" : {
                "special_character_spliter" : {
                    "type" : "word_delimiter",
                    "preserve_original": "true"
                }   
            },
            "analyzer" : {
                "your_analyzer" : {
                    "type" : "custom",
                    "tokenizer" : "whitespace",
                    "filter" : ["lowercase", "special_character_spliter"]
                }
            }
        }
    }
    

    祝你好运!

    【讨论】:

      【解决方案2】:
      "settings" : { 
         "analysis" : {
             "filter" : {
                 "blocks_filter" : {
                     "type" : "word_delimiter",
                     "preserve_original": "true"
                 },
                "shingle":{
                    "type":"shingle",
                    "max_shingle_size":5,
                    "min_shingle_size":2,
                    "output_unigrams":"true"
                 },
                 "filter_stop":{
                    "type":"stop",
                    "enable_position_increments":"false"
                 }
             },
             "analyzer" : {
                 "blocks_analyzer" : {
                     "type" : "custom",
                     "tokenizer" : "whitespace",
                     "filter" : ["lowercase", "blocks_filter", "shingle"]
                 }
             }
         }
      },
      "mappings" : {
         "type" : {
             "properties" : {
                 "company" : {
                     "type" : "string",
                     "analyzer" : "blocks_analyzer"
                 }
             }
         }
      }
      

      【讨论】:

      • nGram 并没有多大意义。如果您确实设置了min_gram: 1,您将收到来自Blocks => B l o c k k s Bl lo 等的每封信...
      • 你是对的 - nGram 在这里不合适。此外,默认情况下,word_delimiters 根据任何字母数字字符分隔标记,所以我现在看到没有理由指定“&”。
      • 你能解释一下最后一部分吗? (关于“块”标记,我从未使用过瓦状过滤器。)
      • shingle 过滤器与 ngram 过滤器的工作方式相同,除了单词而不是字符。因此,如果术语是“H&R Blocks Company”,并且访问者键入“H&R Blocks”,默认情况下“H&R Blocks Company”不一定会上升到自动完成的顶部。但是,使用 shingle 过滤,准确的标记“H&R Blocks”存储在索引中。因此,“H&R Blocks”的查询将获得更高的分数,“H&R Blocks Company”将上升到顶部。带状疱疹过滤器“启用精确匹配和短语匹配”。 reference
      • 顺便说一句,从 Lucene 4.4 开始,enable_position_increments 已被删除,因此这在 ElasticSearch 的较新版本上不会“按原样”工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 2018-10-11
      • 1970-01-01
      相关资源
      最近更新 更多