Как я могу создать запрос elalsearch curl для получения значения поля, которое не является нулевым, а не пустым (""),
Вот запрос mysql:
select field1 from mytable where field1!=null and field1!="";
Как я могу создать запрос elalsearch curl для получения значения поля, которое не является нулевым, а не пустым (""),
Вот запрос mysql:
select field1 from mytable where field1!=null and field1!="";
Значение null и пустая строка не приводят к индексированию значения, и в этом случае вы можете использовать фильтр 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"
}
}
}
}
}
'
Оберните Missing Filter в разделе Must-Not Bool Фильтр. Он будет возвращать документы только там, где это поле существует, и если для свойства null_value установлено значение true, значения явно не равны null.
{
"query":{
"filtered":{
"query":{
"match_all":{}
},
"filter":{
"bool":{
"must":{},
"should":{},
"must_not":{
"missing":{
"field":"field1",
"existence":true,
"null_value":true
}
}
}
}
}
}
}
Как отметил в комментариях @luqmaan, в документации говорится, что фильтр exists
, не отфильтровывает пустые строки, поскольку они считаются ненулевыми значениями.
Поэтому, добавляя к ответу @DrTech, чтобы эффективно фильтровать нулевые и пустые значения строки, вы должны использовать что-то вроде этого:
{
"query" : {
"constant_score" : {
"filter" : {
"bool": {
"must": {"exists": {"field": "<your_field_name_here>"}},
"must_not": {"term": {"<your_field_name_here>": ""}}
}
}
}
}
}
На elasticsearch 5.6, я должен использовать команду ниже, чтобы отфильтровать пустую строку:
GET /_search
{
"query" : {
"regexp":{
"<your_field_name_here>": ".+"
}
}
}
Вы можете использовать не фильтр поверх отсутствующих.
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"not": {
"filter": {
"missing": {
"field": "searchField"
}
}
}
}
}
}
Вы можете сделать это с помощью запроса bool и комбинации must и must_not следующим образом:
GET index/_search
{
"query": {
"bool": {
"must": [
{"exists": {"field": "field1"}}
],
"must_not": [
{"term": {"field1": ""}}
]
}
}
}
Я проверил это с Elasticsearch 5.6.5 в Кибане.
Мы используем Elasticsearch версии 1.6, и я использовал этот запрос у сотрудника, чтобы он не был пустым и не пустым для поля:
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": [
{
"exists": {
"field": "myfieldName"
}
},
{
"not": {
"filter": {
"term": {
"myfieldName": ""
}
}
}
}
]
}
}
}
}
}
Единственное решение, которое работало для меня в 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.
Вы можете использовать запрос комбинации bool с must/must_not, который дает отличную производительность и возвращает все записи, где поле не является нулевым, а не пустым.
bool must_not похоже на "NOT AND", что означает field! = "", bool должно существовать, означает его! = null.
так эффективно: где field1! = null и field1! = ""
GET IndexName/IndexType/_search
{
"query": {
"bool": {
"must": [{
"bool": {
"must_not": [{
"term": { "YourFieldName": ""}
}
]
} }, {
"bool": {
"must": [{
"exists" : { "field" : "YourFieldName" }
}
]
}
}]
}
}
}
Версия ElasticSearch: "версия": {"number": "5.6.10", "lucene_version": "6.6.1"},