【问题标题】:Allowing hypen based words to be tokenized in elasticsearch允许在弹性搜索中对基于连字符的单词进行标记
【发布时间】:2017-10-24 15:28:45
【问题描述】:

我有一个字段 name 的以下映射,它将保存电子商务的产品名称。

   'properties': {
       'name': {
           'type': 'text',
           'analyzer': 'standard',
           'fields': {
                'english': {
                'type': 'text',
                'analyzer': 'english'
            },
        }
    },

假设我要索引/搜索以下字符串。

一包 3 件 T 恤

这两个分析器分别产生术语 [t, shirts], [t, shirt]。

当用户键入 "mens tshirts"

时,这给了我没有得到任何结果的问题

如何在倒排索引中获取术语,例如 [t, shirts, shirt, tshirt', tshirts]

我尝试查看 Stemmers 排除项,但找不到任何可以处理连字符的内容。如果找到更通用的解决方案而不是手动进行排除,我也会有所帮助。因为可能有很多我现在不知道的可能性,例如emails, e-mails

【问题讨论】:

    标签: elasticsearch lucene full-text-search


    【解决方案1】:

    空白标记器可以完成这项工作

    https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-whitespace-tokenizer.html

    POST _analyze
    {
      "tokenizer": "whitespace",
      "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
    }
    

    会产生

    [ The, 2, QUICK, Brown-Foxes, jumped, over, the, lazy, dog's, bone. ]
    

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    • 感谢您的关注。固定。
    • 嗨,当人们搜索 t-shirts 时,这可以帮助我。我更想要的是tshirts,所以在您的示例中,需要的术语是[brownfoxes]
    【解决方案2】:

    我找到了一种解决方案,我想它可以帮助我实现预期的结果。但是,我仍然想看看是否有一些好的和推荐的方法来解决这个问题。

    基本上我将使用多字段来解决这个问题,其中第一个分析器是标准的,第二个是我的自定义。

    根据 Elasticsearch 文档,chars_filters 发生在 tokenizer 之前。所以这个想法是用一个空字符删除-,这将使t-shirts变为tshirt。因此,tokenizer 会将整个术语标记为倒排索引中的tshirts

    GET _analyze
    {
       "tokenizer": "standard",
       "filter": [
          "lowercase",
          {"type": "stop", "stopwords": "_english_"}
       ],
       "char_filter" : [
           "html_strip", 
           {"type": "mapping", "mappings": ["- => "]}
        ],
       "text": "these are t-shirts <table>"
    }
    

    将给出以下令牌

    {
       "tokens": [
          {
             "token": "tshirts",
             "start_offset": 10,
             "end_offset": 18,
             "type": "<ALPHANUM>",
             "position": 2
          }
       ]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      • 2011-07-08
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 2015-02-25
      相关资源
      最近更新 更多