elasticsearch 将一个大词标记为词的组合,elasticsearch,lucene,elasticsearch,Lucene" /> elasticsearch 将一个大词标记为词的组合,elasticsearch,lucene,elasticsearch,Lucene" />

elasticsearch 将一个大词标记为词的组合

elasticsearch 将一个大词标记为词的组合,elasticsearch,lucene,elasticsearch,Lucene,假设我有超级碗是elasticsearch中文档属性的值。“查询”一词如何与“超级碗”相匹配 我读过关于字母标记器和单词分隔符的文章,但它们似乎都不能解决我的问题。基本上,我希望能够将一个大词的组合转换为有意义的词的组合 有很多方法可以做到这一点,而无需更改实际索引内容。例如,如果您使用的是至少5.2(其中引入了normalizers),但也可以是较早的版本,但5.x使其更简单,您可以定义一个规范化器,使文本小写而不更改文本,然后在搜索时使用模糊查询来说明super和bowl之间的空间。不过,

假设我有超级碗是elasticsearch中文档属性的值。“查询”一词如何与“超级碗”相匹配

我读过关于字母标记器和单词分隔符的文章,但它们似乎都不能解决我的问题。基本上,我希望能够将一个大词的组合转换为有意义的词的组合


有很多方法可以做到这一点,而无需更改实际索引内容。例如,如果您使用的是至少5.2(其中引入了
normalizer
s),但也可以是较早的版本,但5.x使其更简单,您可以定义一个规范化器,使文本小写而不更改文本,然后在搜索时使用
模糊
查询来说明
super
bowl
之间的空间。不过,我的解决方案是针对您给出的这个示例的。由于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"
    }
  }
}

我知道已经很晚了,但你可以
你可以定义超级碗与“s碗”、“超级碗”等相同。

这属于哪一类领域?它是一个标题字段吗?或者你能控制的更多。我的理解是,标记化器设计用于分割文本,而不是组合文本。然而,如果你能将“超级碗”和“超级碗”都索引到该字段中,那么你就可以在这两个字段上搜索你是对的,它在一个事件的标题中。索引这两种可能性都不是通过用户输入实现的,那么我可以接受。标准化器是实验性的特性,以后可能会被删除或更改。为什么不在代码中的索引时间处理数据?如果你知道你要搜索什么,这应该很简单。@krrish Elasticsearch中的一个实验性功能不是为了吓跑人们,而是为了保护将来可能发生的功能更改。一个规范化程序无论如何都有一个“正常”的方法来做;-):将字段定义为
文本
,并使用带有
关键字
小写
过滤器的客户分析器。没什么大不了的。