2012-07-19 145 views
46

我只有一個術語過濾器的彈性搜索查詢如下。我的查詢更復雜,但我只是試圖在這裏顯示問題。彈性搜索術語過濾器的連字符問題

{ 
    "filter": { 
      "term": { 
        "field": "update-time" 
       } 
     } 
} 

當我將一個連字符值傳遞給過濾器時,我得到的結果爲零。但是如果我嘗試沒有無價值的價值,我會得到結果。我不確定連字符是否是一個問題,但我的情景讓我相信。

有沒有辦法將連字符轉義出來,以便過濾器返回結果?我試着用一個反斜槓來逃避連字符,我從Lucene論壇上讀到,但這並沒有幫助。

此外,如果我將GUID值傳入此字段中,並且該字段被大括號括起來,則類似於 - {ASD23-34SD-DFE1-42FWW},我是否需要小寫字母字符,並將I還需要擺脫大括號?

感謝

+0

我浪費了一天才弄清楚,沒有得到任何文件回的問題是不是由於惡劣的查詢,但由於我的測試例如一個連字符... – 2015-08-27 09:07:52

回答

79

我猜你的領域進行分析,這是在elasticsearch字符串字段的默認設置。因此,索引索引時,索引不是一個術語「更新時間」,而是兩個術語:「更新」和「時間」。這就是爲什麼你的術語搜索無法找到這個術語。如果您的字段將始終包含必須完全匹配的值,則最好將映射中的此類字段定義爲未分析。您可以通過重新創建新的映射指數做到這一點:

curl -XPUT http://localhost:9200/your-index -d '{ 
    "mappings" : { 
     "your-type" : { 
      "properties" : { 
       "field" : { "type": "string", "index" : "not_analyzed" } 
      } 
     } 
    } 
}' 

curl -XPUT http://localhost:9200/your-index/your-type/1 -d '{ 
    "field" : "update-time" 
}' 

curl -XPOST http://localhost:9200/your-index/your-type/_search -d'{ 
    "filter": { 
     "term": { 
       "field": "update-time" 
     } 
    } 
}' 

另外,如果你想找到基於此字段記錄有一定的靈活性,你可以保持這個領域進行分析,並使用文本查詢來代替:

curl -XPOST http://localhost:9200/your-index/your-type/_search -d'{ 
    "query": { 
     "text": { 
       "field": "update-time" 
     } 
    } 
}' 

請記住,如果你的字段被分析過,那麼這個記錄將通過搜索只是單詞「更新」或單詞「時間」來找到。

+0

我只是要添加此作爲答案。感謝您的詳細解釋。 – Gabbar 2012-07-19 18:50:29

+2

很棒的回答。您可能需要將「文本」更改爲「匹配」。看起來像elasticsearch棄用的文本,並用匹配取而代之。 – khuderm 2016-01-20 18:58:03

0

@imotov答案基於如果您使用spring-data-elasticsearch那麼所有你需要做的就是標記您的字段:中

@Field(type = FieldType.String, index = FieldIndex.not_analyzed) 

代替

@Field(type = FieldType.String) 

問題是你需要儘管放下索引並用新的映射重新實例化它。

1

接受的答案對我來說不適用於彈性6.1。我使用彈性字符串字段中默認提供的「keyword」字段來解決此問題。

{ 
    "filter": { 
      "term": { 
        "field.keyword": "update-time" 
       } 
     } 
}