Пожалуйста, ознакомьтесь с приведенным ниже отображением, примерами документов, запросом запроса и ответом.
Обратите внимание, что я мог добавить не все поля, а только соответствующие поля, чтобы отразить добавленный вами запрос.
Отображение:
PUT facebook
{
"mappings": {
"properties": {
"name":{
"type": "text",
"fields": {
"keyword":{
"type":"keyword"
}
}
},
"description":{
"type": "text",
"fields": {
"keyword":{
"type":"keyword"
}
}
},
"facebook_url":{
"type": "keyword"
},
"year_creation":{
"type": "date"
}
}
}
}
Образцы документов:
В приведенных ниже 4 документах только упомянутый 3rd document
будет тем, что вы хотели бы вернуть.
Документы 1 and 2
имеют пустые значения facebook_url
, тогда как документ 4
вообще не имеет поля на первом месте.
POST facebook/_doc/1
{
"name": "sometext",
"description": "sometext",
"facebook_url": "",
"year_creation": "2019-01-01"
}
POST facebook/_doc/2
{
"name": "sometext",
"description": "sometext",
"facebook_url": "",
"year_creation": "2019-01-01"
}
POST facebook/_doc/3
{
"name" : "sometext",
"description" : "sometext",
"facebook_url" : "http://mytest.fb.link",
"year_creation" : "2019-01-01"
}
POST facebook/_doc/4
{
"name": "sometext",
"description": "sometext",
"year_creation": "2019-01-01"
}
Запрос запроса:
POST facebook/_search
{
"_source": ["name", "description","facebook_url","year_creation"],
"query": {
"bool": {
"must": [
{
"bool": {
"should": [
{
"match": {
"name": "sometext"
}
},
{
"match": {
"description": "sometext"
}
}
]
}
},
{
"exists": {
"field": "facebook_url"
}
},
{
"range": {
"year_creation": {
"gte": "2000-01-01"
}
}
}
],
"must_not": [
{
"term": {
"facebook_url": {
"value": ""
}
}
}
]
}
}
}
Я думаю, что запрос будет объясним.
Я добавил запрос Exists , так что если документ не имеет этого поля , он не будет отображаться в результате, однако для пустых значений Я добавил предложение в must_not
.
Обратите внимание, что в своем дизайне я использовал facebook_url
как ключевое слово тип, так как нет смысла иметь его втип текстаПо этой причине я использовал Term Query .
Также обратите внимание, что для фильтрации по дате я использовал Range Query . Перейдите по ссылкам для получения дополнительной информации, так как важно больше понять, как работает каждый из этих запросов.
Ответ:
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 2.148216,
"hits" : [
{
"_index" : "facebook",
"_type" : "_doc",
"_id" : "3",
"_score" : 2.148216,
"_source" : {
"facebook_url" : "http://mytest.fb.link",
"year_creation" : "2019-01-01",
"name" : "sometext",
"description" : "sometext"
}
}
]
}
}
Обновленный ответ:
Измените поле ANNEE_CREATION
с integer
на Date
, так как это правильный тип дляПоля даты.
Вы не применили запрос диапазона в поле даты на основе вашего запроса.
Обратите внимание, что для must_not
применяется логикана keyword
поле facebook
, которое у вас есть, а не на text
поле.
{
"query":{
"bool":{
"must":[
{
"query_string":{
"query":" Bordeaux",
"fields":[
"VILLE",
"ADRESSE",
"FACEBOOK"
]
}
},
{
"exists":{
"field":"FACEBOOK"
}
}
],
"must_not":[
{
"term":{
"FACEBOOK.keyword":{ <------ Make sure this is a keyword field
"value":""
}
}
}
],
"filter":[
{
"range":{
"FONDS_LEVEES_TOTAL":{
"gt":0
}
}
},
{
"range":{ <----- Apply the range query here based on what you've mentioned in question
"ANNEE_CREATION":{ <----- Make sure this is the date field
"gte": "2015" <----- Make sure you apply correct query parameter in range query
}
}
}
]
}
},
"track_total_hits":true,
"from":0,
"size":8,
"_source":[
"FACEBOOK",
"NOM",
"ANNEE_CREATION",
"FONDS_LEVEES_TOTAL"
]
}
Как и ожидалось, в качестве результата возвращается только документ с Id 3
.
Надеюсь, что это поможет, и если это так, не стесняйтесь поднять голос и / или принять ответ.