2017-08-04 134 views
1

使用their data作爲一個例子,下面的URI搜索命中記錄,Elasticsearch查詢與Elasticsearch教程通配符

curl -XGET 'remotehost:9200/bank/_search?q=city:R*d&_source_include=city&pretty&pretty' 

而下面reques搜身打記錄,

curl -XGET 'remotehost:9200/bank/_search?pretty' -H 'Content-Type: application/json' 
-d'{"query": {"wildcard": {"city": "R*d"} }, 
"_source": ["city"] 
} 
' 

但是這兩種方法應該相互等價。任何想法爲什麼發生這種情況?我在Docker中使用Elasticsearch 5.5.1。

+0

我的回答沒有幫助你嗎? – sunkuet02

+0

@ sunkuet02有用,謝謝!但是這使得兩種搜索方法彼此不一致(直觀)。你知道我是否可以對數據庫做任何事情,以便兩種方法都不需要「關鍵字」,或者兩者都需要「關鍵字」,也許? – Luke

+0

我已經更新了我的答案。請檢查它,希望它有幫助。不要忘記加註並接受我的答案,這有助於。 – sunkuet02

回答

1

您可以通過點擊以下命令來獲得預期結果。該命令在您的命令city中添加一個額外的.keyword

curl -XGET 'localhost:9200/bank/_search?pretty' -H 'Content-Type: application/json' -d'{"query": {"wildcard": {"city.keyword": "R*d"} }, "_source": ["city"]}' 

加入.keyword

當您插入數據elasticsearch的原因,你會發現一個.keyword領域,該領域是not_analyzed。默認情況下,您插入數據的字段是標準分析,並且存在多字段.keyword。如果用數據創建了一個字段city,那麼它會創建一個帶有標準分析器的字段city,並添加一個多字段.keyword,它是not_analyzed

在你的情況下,你需要一個not_analyzed字段來查詢(如wildcard查詢)。所以,你的查詢應該在city.keyword這個字段默認是not_analyze。

在第一種情況下,您使用查詢參數命中了elasticsearch的獲取請求。 Elasticsearch會自動將查詢轉換爲第二種格式。

對於可靠的來源,你可以按照Official docs

string領域已經分裂成兩個新類型:text,應 使用全文搜索和keyword,它應該用於 關鍵字搜索。

把事情做好,Elasticsearch決定借用一個想法, 最初從Logstash朵朵:字符串現在將映射既作爲 textkeyword默認。例如,如果您索引 以下簡單的文檔:

{ 
    "foo": "bar" 
} 

然後下面的動態映射將被創建:

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

因此,它將既可以在foo上執行全文搜索 ,並使用foo.keyword關鍵字搜索和聚合 字段。

+0

你能否提供一個關於「Elasticsearch會自動將」URI查詢轉換爲「.keyword」的正文查詢的評論? – Luke

+0

@Luke,一旦我讀了它。我會在幾分鐘內給你鏈接它 – sunkuet02

+0

@Luke,請你檢查鏈接:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-在allow_leading_wildcard部分的query.html我想你會在這個官方博客上找到你的答案 – sunkuet02