我正在做一个ElasticSearch(6.2)项目,其中的index
有许多keyword
字段,它们通过lowercase
过滤器进行规范化,以执行不区分大小写的搜索。搜索效果很好,返回规范化字段的实际值(不是小写的)。但是聚合不返回字段的实际值(返回小写)。
下面的示例取自ElasticSearch文档。
https://www.elastic.co/guide/en/elasticsearch/reference/master/normalizer.html
正在创建索引:
PUT index { "settings": { "analysis": { "normalizer": { "my_normalizer": { "type": "custom", "char_filter": [], "filter": ["lowercase", "asciifolding"] } } } }, "mappings": { "_doc": { "properties": { "foo": { "type": "keyword", "normalizer": "my_normalizer" } } } } }
插入单据:
PUT index/_doc/1 { "foo": "Bar" } PUT index/_doc/2 { "foo": "Baz" }
使用聚合搜索:
GET index/_search { "size": 0, "aggs": { "foo_terms": { "terms": { "field": "foo" } } } }
结果:
{ "took": 43, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped" : 0, "failed": 0 }, "hits": { "total": 3, "max_score": 0.0, "hits": { "total": 2, "max_score": 0.47000363, "hits": [ { "_index": "index", "_type": "_doc", "_id": "1", "_score": 0.47000363, "_source": { "foo": "Bar" } }, { "_index": "index", "_type": "_doc", "_id": "2", "_score": 0.47000363, "_source": { "foo": "Baz" } } ] } }, "aggregations": { "foo_terms": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": "bar", "doc_count": 1 }, { "key": "baz", "doc_count": 1 } ] } } }
如果检查聚合,您将看到返回了小写值。例如“key”:“bar”
。
有没有办法更改聚合以返回实际值?
如果您希望执行不区分大小写的搜索,但在聚合中返回精确值,则不需要任何规范化程序。您可以简单地将text
字段(该字段将标记小写,默认情况下允许不区分大小写的搜索)与keyword
子字段一起使用。前者用于搜索,后者用于聚合。是这样的:
PUT index
{
"mappings": {
"_doc": {
"properties": {
"foo": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}
对两个文档进行索引后,您可以在foo.keyword
上发出terms
聚合:
GET index/_search
{
"size": 2,
"aggs": {
"foo_terms": {
"terms": {
"field": "foo.keyword"
}
}
}
}
结果如下所示:
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1,
"hits": [
{
"_index": "index",
"_type": "_doc",
"_id": "2",
"_score": 1,
"_source": {
"foo": "Baz"
}
},
{
"_index": "index",
"_type": "_doc",
"_id": "1",
"_score": 1,
"_source": {
"foo": "Bar"
}
}
]
},
"aggregations": {
"foo_terms": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "Bar",
"doc_count": 1
},
{
"key": "Baz",
"doc_count": 1
}
]
}
}
}
我试图在关键字类型字段上进行不区分大小写的聚合,但在使其工作时遇到了问题。 到目前为止,我尝试的是添加一个名为“小写”的自定义分析器,它使用“关键字”标记器和“小写”过滤器。然后,我在映射中添加了一个名为“use_lowercase”的字段,用于我想要使用的字段。我还想保留现有的“文本”和“关键字”字段组件,因为我可能想在字段中搜索术语。 以下是索引定义,包括自定义分析器: 现在,我添加了两条记录
在Elasticsearch中,您可以执行返回点击的搜索,同时在一个响应中返回与点击分开的聚合结果。这是非常强大和有效的,因为您可以运行查询和多个聚合,并一次获得两个(或其中一个)操作的结果,避免使用简洁和简化的API进行网络往返。 我想执行搜索,当我对聚合有查询时返回点击。但我不确定如何才能做到以上几点? 我正在使用以下查询:
我试图在elasticsearch中对术语聚合的桶进行排序,不区分大小写。以下是字段映射: 请注意,此处的此数据结构适用于PHP。 聚合如下所示: 这是可行的,但生成的桶是按字典顺序排列的。 我在这里找到了一些有趣的文档,它们解释了如何做到这一点,但这是在对点击进行排序的上下文中,而不是在聚合桶中。 我还是试过了。以下是我创建的分析器: 这里是更新的字段映射,使用分析器有一个名为“sort”的新子
这是我的ES查询: ==创建索引=== ===插入数据=== ==获取结果的查询=== ==检索到的结果=== ==期望结果=== 所需术语按文档搜索术语的频率,如下所示 我尝试过Bucket聚合、Terms聚合和其他聚合,但没有得到这个结果。 提前谢谢你的帮助!
此处为elasticsearch新用户,但存在术语聚合问题。我为187份文档编制了索引,其中包含“名称”、“主机”、“风险”等字段。字段风险有4个唯一值(“关键”、“高”、“中”、“低”、“信息”),我正在运行这样的术语聚合: 我希望得到一个结果,说明我有x个临界值,x个高值等等。问题是,我没有得到返回的桶。 我的Elasticsearch版本是7.12.0有什么想法吗 > 编辑:这是映射: 以下
本文向大家介绍如何在Oracle中执行不区分大小写的搜索?,包括了如何在Oracle中执行不区分大小写的搜索?的使用技巧和注意事项,需要的朋友参考一下 问题: 您要在Oracle中执行不区分大小写的搜索。 解 处理案例问题的一种方法是使用内置的UPPER和LOWER函数。这些函数使您可以强制单个操作对字符串进行大小写转换 示例 在上面的示例中,将full_name1和full_name2首先转换为