幾天前我開始研究 Elasticsearch,我創建了一些分析器和映射,并成功地在其中插入了一些資料。當我嘗試查詢其中包含一些特殊字符的資料時,就會出現問題。最初我使用standard分析器,但在閱讀了更多選項后,我決定使用它,whitespace因為它也標記了特殊字符。但是,我仍然無法查詢資料。但是,如果我放field.raw(其中欄位是物件的實際屬性),我會得到我需要的結果。但是,.raw繞過分析器,我想知道它是否會破壞這一切的目的。由于空白對我不起作用,我恢復到那個standard。
這是我構建的分析器:
PUT demoindex
{
"settings": {
"analysis": {
"filter": {
"ngram": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 20,
"token_chars": [
"letter",
"digit"
]
},
"splcharfilter": {
"type": "pattern_capture",
"preserve_original": true,
"patterns": [
"([?/-])"
]
}
},
"analyzer": {
"my_field_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"ngram",
"splcharfilter"
]
}
}
}
}
}
我建立的映射:
PUT demoindex/_mapping
{
"properties": {
"name": {
"type": "text",
"analyzer": "my_field_analyzer",
"search_analyzer": "simple",
"fields": {
"raw": {
"type": "keyword"
}
}
},
"area": {
"type": "text",
"analyzer": "my_field_analyzer",
"search_analyzer": "simple",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
不起作用的查詢:
GET /demoindex/_search?pretty
{
"from": 0,
"query": {
"bool": {
"filter": [
{
"term": {
"area": {
"value": "is - application"
}
}
},
{
"term": {
"name": {
"value": "hem"
}
}
}
]
}
},
"size": 15
}
查詢 WORKS:
GET /demoindex/_search?pretty
{
"from": 0,
"query": {
"bool": {
"filter": [
{
"term": {
"area.raw": {
"value": "is - application"
}
}
},
{
"term": {
"name": {
"value": "hem"
}
}
}
]
}
},
"size": 15
}
如您所見,我不得不使用area.raw它來匹配內容并回傳檔案。由于 name 不應該有任何特殊字符,沒有 . 應該沒問題 .raw,但其他欄位將具有可能不限于-.
那么,有人可以指出我做錯了什么或我解釋錯了嗎?還是有更好的方法來實作這一目標?
PS:版本資訊
彈性搜索:7.10.1
盧森:8.7.0
uj5u.com熱心網友回復:
- 不分析關鍵字欄位。
- 文本欄位被分析。
要檢查這些是如何分析的以及生成了哪些令牌,您可以使用 Elasticsearch 中的“分析 API”。
在你的情況下:
POST demoindex/_analyze
{
"text": ["is - application"],
"field": "area"
}
它會輸出
{
"tokens" : [
{
"token" : "i"
},
{
"token" : "is"
},
{
"token" : "a"
},
{
"token" : "ap"
},
{
"token" : "app"
},
{
"token" : "appl"
},
{
"token" : "appli"
},
{
"token" : "applic"
},
{
"token" : "applica"
},
{
"token" : "applicat"
},
{
"token" : "applicati"
},
{
"token" : "applicatio"
},
{
"token" : "application"
}
]
}
因此,當您提供值 area.raw:"is - application" 作為關鍵字型別時,它將按原樣保存,因此您的以下 Term 查詢有效。
術語查詢用于精確匹配,應與未分析的欄位一起使用,例如 area.raw,在您的情況下是關鍵字。
GET /demoindex/_search?pretty
{
"from": 0,
"query": {
"bool": {
"filter": [
{
"term": {
"area.raw": {
"value": "is - application"
}
}
}
]
}
},
"size": 15
}
但是,當您在文本欄位上應用相同的 Term 查詢時,它無法正常作業,因為它試圖與提供的值完全匹配,但正如我們在上面看到的那樣,該區域值已被標記化,
因此,正如 Elasticsearch 所建議的,用戶“匹配”文本(分析欄位)查詢總是更好。所以 belwo 查詢將產生相同的結果
GET /demoindex/_search?pretty
{
"from": 0,
"query": {
"bool": {
"filter": [
{
"match": {
"area": {
"query": "is - application"
}
}
}
]
}
},
"size": 15
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/431393.html
