2017-03-20 65 views
0

我正在使用彈性搜索來搜索我的ID。我的ID看起來像21.11101/0000-0000-9B71-2。然而,當我使用它在我的ES,它會拋出一個錯誤,說:無法使用包含「/ 0」的字符串搜索彈性搜索

無法分析查詢[21.11101/0000-0000-9B71-2]」

遇到:EOF後:\ 「/ 0000-0000-9B71-2 \」

我想這是因爲ES認爲/0EOF字符。如何分辨ES對待我的搜索查詢作爲一個普通的文本?這裏是我的查詢:

GET _search 
{ 
    "query": { 
     "query_string": { 
      "query": "21.11101/0000-0000-9B71-2" 
     } 
    } 
} 

這裏是我的_mapping

"PID": { 
    "type": "text", 
    "fields": { 
     "keyword": { 
      "type": "keyword", 
      "ignore_above": 256 
     } 
    } 
} 

我想使用前綴的查詢,所以基本上,我的查詢將看起來像這樣:

GET _search 
{ 
    "query": { 
    "prefix": { 
     "ID" : "21.11101/00" 
    } 
    } 
} 

但該查詢返回0命中。我猜是因爲上面的錯誤。那麼,我該如何解決這個問題呢?

感謝您的幫助。

回答

0

讓我們打破它一點:你的映射說的是:

  • "PID": { "type": "text", ...這意味着PID字段的內容將文本與默認分析儀,它standard。它會通過空格和一些單詞分隔符來標記輸入文本,如-(連字符),/(正斜槓)等。
  • ... "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } }將提示ES保留PID字段的其他版本作爲關鍵字,該關鍵字可通過別名PID.keyword訪問。 multi-fields的重要限制是您無法對其執行搜索。您只能進行排序和聚合。

考慮到這一點我的建議是,指定其不會記號化輸入文本不規範的分析簡單(這是keyword分析儀):

curl -XPUT http://localhost:9200/my_pids -d ' 
{ 
    "mappings": { 
    "pid": { 
     "properties": { 
     "PID": { 
      "type": "text", 
      "analyzer": "keyword", 
      "fields": { 
      "keyword": { 
       "type": "keyword", 
       "ignore_above": 256 
      } 
      } 
     } 
     } 
    } 
    } 
}' 

如果你不會使用排序/聚合PID.keyword字段 - 請隨時放棄fields部分。

希望它有幫助:)