[英]Elasticsearch query_string filter with Fields when not empty string
我試圖用 elasticsearch DSL 構建一個 query_string,我的查詢是 sql 樣式是這樣的:
SELECT NAME,DESCRIPTION, URL, FACEBOOK_URL, YEAR_CREATION FROM MY_INDEX WHERE FACEBOOK_URL<>'' and ( Match('NAME: sometext OR DESCRIPTION: sometext )) AND YEAR_CREATION > 2000
我不知道如何為 FACEBOOK_URL 包含沒有空值的過濾器
感謝幫助...
請參閱下面的映射、示例文檔、請求查詢和響應。
請注意,我可能沒有添加所有字段,而僅添加了相關字段,以便反映您添加的查詢。
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 。 通過鏈接執行 go 以獲得更多說明,因為了解更多關於每個查詢的工作原理非常重要。
{
"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
字段,因為這是 Date 字段的正確類型。
您尚未根據相關查詢對日期字段應用范圍查詢。
請注意,對於must_not
將邏輯應用於您擁有的facebook
的keyword
字段而不是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
的文檔作為結果返回。
@Kamal 的觀點非常清楚。 您應該檢查“FACEBOOK”字段的類型,它必須是keyword
類型,而不是text
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.