我有一个字符串,我想索引为关键字类型,但使用特殊的逗号分析器: 例如:
“旧金山,波士顿,纽约” - > “旧金山”,“波士顿”,纽约“
应该同时被索引和聚合,以便我可以通过存储桶将其拆分。在5.0.0之前,以下工作: 索引设置:
{
'settings': {
'analysis': {
'tokenizer': {
'comma': {
'type': 'pattern',
'pattern': ','
}
},
'analyzer': {
'comma': {
'type': 'custom',
'tokenizer': 'comma'
}
}
},
},
}
使用以下映射:
{
'city': {
'type': 'string',
'analyzer': 'comma'
},
}
现在在5.3.0及以上的分析器不再是关键字类型的有效属性,我的理解是我想在此处使用keyword类型。如何使用自定义分析器指定可聚合,索引,可搜索的文本类型?
答案 0 :(得分:2)
您可以使用multifields以两种不同的方式为相同字段编制索引,一种用于搜索,另一种用于聚合。
此外,我也可以为trim添加一个过滤器并小写生成的标记,以帮助您更好地搜索。
<强>映射强>
PUT commaindex2
{
"settings": {
"analysis": {
"tokenizer": {
"comma": {
"type": "pattern",
"pattern": ","
}
},
"analyzer": {
"comma": {
"type": "custom",
"tokenizer": "comma",
"filter": ["lowercase", "trim"]
}
}
}
},
"mappings": {
"city_document": {
"properties": {
"city": {
"type": "keyword",
"fields": {
"city_custom_analyzed": {
"type": "text",
"analyzer": "comma",
"fielddata": true
}
}
}
}
}
}
}
索引文件
POST commaindex2/city_document
{
"city" : "san fransisco, new york, london"
}
搜索查询
POST commaindex2/city_document/_search
{
"query": {
"bool": {
"must": [{
"term": {
"city.city_custom_analyzed": {
"value": "new york"
}
}
}]
}
},
"aggs": {
"terms_agg": {
"terms": {
"field": "city",
"size": 10
}
}
}
}
注意强>
如果您想在索引字段上运行aggs,就像您想要计算存储桶中每个城市一样,您可以在city.city_custom_analyzed
字段上运行术语聚合。
POST commaindex2/city_document/_search
{
"query": {
"bool": {
"must": [{
"term": {
"city.city_custom_analyzed": {
"value": "new york"
}
}
}]
}
},
"aggs": {
"terms_agg": {
"terms": {
"field": "city.city_custom_analyzed",
"size": 10
}
}
}
}
希望这有帮助
答案 1 :(得分:1)
由于您使用的是ES 5.3,我建议采用不同的方法,使用摄取管道在索引时分割您的字段。
PUT _ingest/pipeline/city-splitter
{
"description": "City splitter",
"processors": [
{
"split": {
"field": "city",
"separator": ","
}
},
{
"foreach": {
"field": "city",
"processor": {
"trim": {
"field": "_ingest._value"
}
}
}
}
]
}
然后您可以索引新文档:
PUT cities/city/1?pipeline=city-splitter
{ "city" : "San Francisco, Boston, New York" }
最后,您可以对city
进行搜索/排序,并在字段city.keyword
上运行汇总,就好像城市已在您的客户端应用程序中拆分一样:
POST cities/_search
{
"query": {
"match": {
"city": "boston"
}
},
"aggs": {
"cities": {
"terms": {
"field": "city.keyword"
}
}
}
}