使用5.3.0中的自定义分析器创建关键字字符串类型

时间:2017-04-17 23:00:12

标签: elasticsearch elasticsearch-5

我有一个字符串,我想索引为关键字类型,但使用特殊的逗号分析器: 例如:

“旧金山,波士顿,纽约” - > “旧金山”,“波士顿”,纽约“

应该同时被索引和聚合,以便我可以通过存储桶将其拆分。在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类型。如何使用自定义分析器指定可聚合,索引,可搜索的文本类型?

2 个答案:

答案 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"
      }
    }
  }
}