elasticsearch 将一个大词标记为词的组合
假设我有超级碗是elasticsearch中文档属性的值。“查询”一词如何与“超级碗”相匹配 我读过关于字母标记器和单词分隔符的文章,但它们似乎都不能解决我的问题。基本上,我希望能够将一个大词的组合转换为有意义的词的组合elasticsearch 将一个大词标记为词的组合,elasticsearch,lucene,elasticsearch,Lucene,假设我有超级碗是elasticsearch中文档属性的值。“查询”一词如何与“超级碗”相匹配 我读过关于字母标记器和单词分隔符的文章,但它们似乎都不能解决我的问题。基本上,我希望能够将一个大词的组合转换为有意义的词的组合 有很多方法可以做到这一点,而无需更改实际索引内容。例如,如果您使用的是至少5.2(其中引入了normalizers),但也可以是较早的版本,但5.x使其更简单,您可以定义一个规范化器,使文本小写而不更改文本,然后在搜索时使用模糊查询来说明super和bowl之间的空间。不过,
有很多方法可以做到这一点,而无需更改实际索引内容。例如,如果您使用的是至少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中的一个实验性功能不是为了吓跑人们,而是为了保护将来可能发生的功能更改。一个规范化程序无论如何都有一个“正常”的方法来做;-):将字段定义为
文本
,并使用带有关键字
和小写
过滤器的客户分析器。没什么大不了的。