自定义分析器在弹性搜索中不起作用
Custom analyzer not working in elasticsearch
运行弹性版本1.6
我正在尝试为我在 elasticsearch 中的索引设置自定义分析器。我的索引 / 有一些属性,其中包含一些重音符号和特殊字符。
就像我的一个 属性 名字有这样的价值,"name" => "Está loca"。
所以我想要实现的是,每当我尝试通过这种方式进行搜索时,
http://localhost:9200/tutorial/helloworld/_search?q=esta
我应该得到 "Está loca" 的结果。我已经完成了以下 link 并配置了必要的分析器,这在 link 中有解释。
https://www.elastic.co/guide/en/elasticsearch/guide/current/asciifolding-token-filter.html
curl -XPUT 'localhost:9200/tutorial?pretty' -H 'Content-Type: application/json' -d'
{
"mappings":{
"helloworld":{
"properties": {
"name": {
"type": "string",
"analyzer": "standard",
"fields": {
"folded": {
"type": "string",
"analyzer": "folding"
}
}
}
}
}
},
"settings": {
"analysis": {
"analyzer": {
"folding": {
"tokenizer": "standard",
"filter": [ "lowercase", "asciifolding" ]
}
}
}
}
}'
我在创建索引时配置了这个,并做了一些这样的条目用于测试,
curl -X POST 'http://localhost:9200/tutorial/helloworld/1' -d '{ "name": "Está loca!" }'
curl -X POST 'http://localhost:9200/tutorial/helloworld/2' -d '{ "name": "Está locá!" }'
但是在这样搜索的时候,
http://localhost:9200/tutorial/helloworld/_search?q=esta
什么都没有发生。我只希望每当用户使用任何语言(例如英语)进行搜索时,它都应该得到相同的结果。请任何人都可以提供帮助,我怎样才能实现过去 1 周的挣扎。
您将无法在 _all
字段中搜索 esta
关键字。由于 elasticsearch 默认情况下仅在构造 _all
field.
时应用标准分析器
所以您的以下查询
GET folding_index1/helloworld/_search?q=esta
在弹性 dsl 中生成以下匹配查询。
GET folding_index1/helloworld/_search
{
"query": {
"match": {
"_all": "esta"
}
}
}
针对 _all
字段进行搜索,因此找不到名称的折叠标记。
您可以执行以下操作,但即使针对多字段提到 include_in_all
,它仍然对 _all 字段应用标准分析器。
PUT folding_index1
{
"mappings": {
"helloworld": {
"properties": {
"name": {
"type": "string",
"analyzer": "standard",
"fields": {
"folded": {
"type": "string",
"analyzer": "folding",
"include_in_all": true
}
}
}
}
}
},
"settings": {
"analysis": {
"analyzer": {
"folding": {
"tokenizer": "standard",
"filter": ["lowercase", "asciifolding"]
}
}
}
}
}
像下面这样的查询可以为您工作。更多关于 _all field analyzer
POST folding_index1/_search?q=name.folded:esta
这个link也对我帮助很大,为我的场景提供了准确的分析器。
https://vanwilgenburg.wordpress.com/2013/08/03/diacritics-in-elasticsearch/
运行弹性版本1.6
我正在尝试为我在 elasticsearch 中的索引设置自定义分析器。我的索引 / 有一些属性,其中包含一些重音符号和特殊字符。
就像我的一个 属性 名字有这样的价值,"name" => "Está loca"。 所以我想要实现的是,每当我尝试通过这种方式进行搜索时, http://localhost:9200/tutorial/helloworld/_search?q=esta
我应该得到 "Está loca" 的结果。我已经完成了以下 link 并配置了必要的分析器,这在 link 中有解释。 https://www.elastic.co/guide/en/elasticsearch/guide/current/asciifolding-token-filter.html
curl -XPUT 'localhost:9200/tutorial?pretty' -H 'Content-Type: application/json' -d'
{
"mappings":{
"helloworld":{
"properties": {
"name": {
"type": "string",
"analyzer": "standard",
"fields": {
"folded": {
"type": "string",
"analyzer": "folding"
}
}
}
}
}
},
"settings": {
"analysis": {
"analyzer": {
"folding": {
"tokenizer": "standard",
"filter": [ "lowercase", "asciifolding" ]
}
}
}
}
}'
我在创建索引时配置了这个,并做了一些这样的条目用于测试,
curl -X POST 'http://localhost:9200/tutorial/helloworld/1' -d '{ "name": "Está loca!" }'
curl -X POST 'http://localhost:9200/tutorial/helloworld/2' -d '{ "name": "Está locá!" }'
但是在这样搜索的时候, http://localhost:9200/tutorial/helloworld/_search?q=esta 什么都没有发生。我只希望每当用户使用任何语言(例如英语)进行搜索时,它都应该得到相同的结果。请任何人都可以提供帮助,我怎样才能实现过去 1 周的挣扎。
您将无法在 _all
字段中搜索 esta
关键字。由于 elasticsearch 默认情况下仅在构造 _all
field.
所以您的以下查询
GET folding_index1/helloworld/_search?q=esta
在弹性 dsl 中生成以下匹配查询。
GET folding_index1/helloworld/_search
{
"query": {
"match": {
"_all": "esta"
}
}
}
针对 _all
字段进行搜索,因此找不到名称的折叠标记。
您可以执行以下操作,但即使针对多字段提到 include_in_all
,它仍然对 _all 字段应用标准分析器。
PUT folding_index1
{
"mappings": {
"helloworld": {
"properties": {
"name": {
"type": "string",
"analyzer": "standard",
"fields": {
"folded": {
"type": "string",
"analyzer": "folding",
"include_in_all": true
}
}
}
}
}
},
"settings": {
"analysis": {
"analyzer": {
"folding": {
"tokenizer": "standard",
"filter": ["lowercase", "asciifolding"]
}
}
}
}
}
像下面这样的查询可以为您工作。更多关于 _all field analyzer
POST folding_index1/_search?q=name.folded:esta
这个link也对我帮助很大,为我的场景提供了准确的分析器。
https://vanwilgenburg.wordpress.com/2013/08/03/diacritics-in-elasticsearch/