我如何创建Elasticsearch curl查询以获取不为null且不为空的字段值(“”),
这是mysql查询:
select field1 from mytable where field1!=null and field1!="";
我如何创建Elasticsearch curl查询以获取不为null且不为空的字段值(“”),
这是mysql查询:
select field1 from mytable where field1!=null and field1!="";
Answers:
空值和空字符串都不会索引任何值,在这种情况下,您可以使用exists
过滤器
curl -XGET 'http://127.0.0.1:9200/test/test/_search?pretty=1' -d '
{
"query" : {
"constant_score" : {
"filter" : {
"exists" : {
"field" : "myfield"
}
}
}
}
}
'
或结合(例如)在title
现场进行全文搜索:
curl -XGET 'http://127.0.0.1:9200/test/test/_search?pretty=1' -d '
{
"query" : {
"filtered" : {
"filter" : {
"exists" : {
"field" : "myfield"
}
},
"query" : {
"match" : {
"title" : "search keywords"
}
}
}
}
}
'
An empty string is a non-null value.
- elastic.co/guide/en/elasticsearch/reference/current/...
在Elasticsearch 5.6上,我必须使用以下命令过滤掉空字符串:
GET /_search
{
"query" : {
"regexp":{
"<your_field_name_here>": ".+"
}
}
}
您可以通过布尔查询以及must和must_not的组合来做到这一点,如下所示:
GET index/_search
{
"query": {
"bool": {
"must": [
{"exists": {"field": "field1"}}
],
"must_not": [
{"term": {"field1": ""}}
]
}
}
}
我在Kibana中使用Elasticsearch 5.6.5进行了测试。
您可以在missing之上使用not过滤器。
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"not": {
"filter": {
"missing": {
"field": "searchField"
}
}
}
}
}
}
在5.6.5中对我有用的唯一解决方案是bigstone1998的正则表达式答案。尽管出于性能方面考虑,我宁愿不使用正则表达式搜索。我相信其他解决方案不起作用的原因是因为将分析标准字段,因此没有空字符串令牌可否定。因为空字符串被视为非空值,所以存在查询本身也无济于事。
如果您无法更改索引,则正则表达式方法可能是您唯一的选择,但是如果您可以更改索引,则添加关键字子字段将解决此问题。
在索引的映射中:
"myfield": {
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
}
然后,您可以简单地使用查询:
{
"query": {
"bool": {
"must": {
"exists": {
"field": "myfield"
}
},
"must_not": {
"term": {
"myfield.keyword": ""
}
}
}
}
}
注意.keyword
must_not组件中的。
type=text
字段。但是可以通过扩展ES模式来解决"myfield": { "type": "text", fielddata: true, "fields": { "keyword": { "type": "keyword" } } }
.keyword
?由于must_not
完全匹配,它与被分析的字段有什么关系吗?如果是这样,如果我们不使用.keyword
,那意味着什么?顺便说一句,.keyword
为我使用作品。
Elastic search Get all record where condition not empty.
const searchQuery = {
body: {
query: {
query_string: {
default_field: '*.*',
query: 'feildName: ?*',
},
},
},
index: 'IndexName'
};
您可以将bool组合查询与must / must_not一起使用,以提供出色的性能并返回该字段不为null且不为空的所有记录。
bool must_not类似于“ NOT AND”,表示字段!=“”,bool必须存在意味着其!= null。
如此有效地启用:其中field1!= null和field1!=“”
GET IndexName/IndexType/_search
{
"query": {
"bool": {
"must": [{
"bool": {
"must_not": [{
"term": { "YourFieldName": ""}
}]
}
}, {
"bool": {
"must": [{
"exists" : { "field" : "YourFieldName" }
}]
}
}]
}
}
}
ElasticSearch版本:
"version": {
"number": "5.6.10",
"lucene_version": "6.6.1"
}
您需要将bool查询与must / must_not一起使用并且存在
取得地点为空的地方
{
"query": {
"bool": {
"must_not": {
"exists": {
"field": "place"
}
}
}
}
}
取得不为空的地方
{
"query": {
"bool": {
"must": {
"exists": {
"field": "place"
}
}
}
}
}