2014-10-31 39 views
2

我有一个ES索引,其中包含来自某些科学实验的参数数据。按关键字长度筛选“术语聚合”

我有以下条款聚集:

{ 
    "aggs": { 
     "variables": { 
      "terms": { 
       "field": "value", 
       "size": 100 
      } 
     } 
    }, 
    "size": 0 
} 

它返回这样的结果:

{ 
    "took" : 3, 
    "timed_out" : false, 
    "_shards" : { 
     "total" : 5, 
     "successful" : 5, 
     "failed" : 0 
    }, 
    "hits" : { 
     "total" : 9928, 
     "max_score" : 0.0, 
     "hits" : [ ] 
    }, 
    "aggregations" : { 
     "variables" : { 
      "buckets" : [ { 
       "key" : "00", 
       "doc_count" : 158 
      }, { 
       "key" : "1", 
       "doc_count" : 158 
      }, { 
       "key" : "2", 
       "doc_count" : 158 
      }, { 
       "key" : "pressure", 
       "doc_count" : 158 
      }, { 
       "key" : "seconds", 
       "doc_count" : 158 
      }, { 
       "key" : "since", 
       "doc_count" : 158 
      }, { 
       "key" : "s", 
        "doc_count" : 156 
      }, { 
       "key" : "speed", 
        "doc_count" : 127 
      }, { 
       "key" : "sample", 
        "doc_count" : 121 
      }, { 
       "key" : "a", 
        "doc_count" : 104 
      } ] 
     } 
    } 
} 

我想要做的就是告诉ElasticSearch忽略所有的键,其长度小于5 ;

例如过滤掉"key": "a","key": "s"等等。

这可能吗?

回答

1

好了,我解决了这个问题。我重新索引使用自定义分析器中的数据,其内容如下:

PUT $host/$index

{ 
    "settings": { 
     "analysis": { 
      "filter": { 
       "min_length_5_filter": { 
        "type": "length", 
        "min": 5, 
        "max": 256 
       } 
      }, 
      "analyzer": { 
       "variable_name_analyzer": { 
        "type": "custom", 
        "tokenizer": "lowercase", 
        "filter": ["min_length_5_filter"] 
       } 
      } 
     } 
    } 
} 

,然后在索引映射:

PUT $host/$index/_mapping/$mapping_name

... 
"parameters": { 
    "properties": { 
     "name": { 
      "type": "string", 
      "analyzer": "variable_name_analyzer" 
     }, 
     "value": { 
      "type": "string", 
      "analyzer": "variable_name_analyzer" 
     } 
    } 
}, 
... 

使用上面的方法,使用最小长度过滤标记化的字符串使我可以删除大量的垃圾值,现在“术语聚合”工作真的很好。希望这可以帮助别人!

1

我认为你应该使用一个Regexp Filter有通缉的结果:

"filter": { 
     "regexp":{ 
      "value" : ".{2,}" 
     } 
    } 
+0

好的建议,谢谢! 问题是变量存储在句子中;例如“1970-1-01 00:00:00之前的秒”或“风速(每小时英里数)”。 相反,我会尝试使用自定义分析器来索引不同的词,并筛选长度小于5个字符的任何键。 – 2014-10-31 15:00:49