【问题标题】:Tokenize a big word into combination of words将一个大词标记为词的组合
【发布时间】:2017-08-24 22:42:10
【问题描述】:

假设我有 Super Bowl 是弹性搜索中文档属性的值。术语查询 superbowl 如何匹配 Super Bowl

我阅读了有关字母标记器和单词分隔符的信息,但两者似乎都不能解决我的问题。基本上我希望能够将大词的组合转换成有意义的词组合。

https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-word-delimiter-tokenfilter.html

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

【问题讨论】:

  • 这是什么类型的字段?它是标题字段吗?或者你有更多控制权的东西。我的理解是标记器旨在拆分文本而不是组合它。但是,如果您可以将“超级碗”和“超级碗”都索引到该字段中,那么您可以同时搜索
  • 你说得对,它在事件的标题中。索引这两种可能性不是通过用户输入发生的,那么我可以接受。

标签: elasticsearch lucene


【解决方案1】:

我知道这已经很晚了,但你可以使用synonym filter 您可以将 super bowl 定义为“s bowl”、“SuperBowl”等。

【讨论】:

    【解决方案2】:

    有一些方法可以做到这一点,而无需更改您实际索引的内容。例如,如果您至少使用 5.2(其中引入了 normalizers),但它也可以是早期版本,但 5.x 更容易,您可以定义一个规范化器来小写您的文本而不更改它,然后在搜索时使用fuzzy 查询来说明superbowl 之间的空间。我的解决方案虽然特定于你给出的这个例子。与 Elasticsearch 大部分时间一样,人们需要考虑将哪些类型的数据输入 Elasticsearch 以及在搜索时需要哪些数据。

    无论如何,如果您对这里的方法感兴趣,那就是:

    DELETE test
    PUT /test
    {
      "settings": {
        "analysis": {
          "normalizer": {
            "my_normalizer": {
              "type": "custom",
              "char_filter": [],
              "filter": ["lowercase", "asciifolding"]
            }
          }
        }
      },
      "mappings": {
        "test": {
          "properties": {
            "title": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "normalizer": "my_normalizer"
                }
              }
            }
          }
        }
      }
    }
    POST test/test/1
    {"title":"Super Bowl"}
    
    GET /test/_search
    {
      "query": {
        "fuzzy": {
          "title.keyword": "superbowl"
        }
      }
    }
    

    【讨论】:

    • Normalisers 是实验性功能,以后可能会被删除或更改。为什么不在代码中的索引时间处理您的数据?如果您知道要搜索什么,这应该很简单。
    • @krrish Elasticsearch 中的一个实验性功能并不是为了吓跑人们,而是为了保护未来可能发生的功能变化。无论如何,规范化器都有一种“正常”的方式来做到这一点;-):将字段定义为text,并使用带有keywordlowercase 过滤器的客户分析器。没什么大不了的。
    猜你喜欢
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多