2012-09-11 18 views
1

我想對包含多個單詞的字段(例如'Name1 Name2',有時候帶點和逗號)做一個簡單的方面請求,但我得到的是......elasticsearch在空間方面分裂

"terms" : [{ 
    "term" : "Name1", 
    "count" : 15 
}, 
{ 
    "term" : "Name2", 
    "count" : 15 
}] 

所以我的字段值用空格分開,然後運行方面的請求......

查詢例如:

curl -XGET http://my_server:9200/idx_occurrence/Occurrence/_search?pretty=true -d '{ 
    "query": { 
    "query_string": { 
     "fields": [ 
     "dataset" 
     ], 
     "query": "2", 
     "default_operator": "AND" 
    } 
    }, 
    "facets": { 
    "test": { 
     "terms": { 
     "field": [ 
      "speciesName" 
     ], 
     "size": 50000 
     } 
    } 
    } 
}' 
+0

查詢在這裏只是一個例子(我不想給我的真實網址)。 事實是,speciesName字段需要不被分析。我想知道這是否意味着我絕對必須重新創建索引結構(大量數據),或者有其他方法可以避免這種情況... – user1249791

回答

4

首先,javanna從實際角度提供了一個非常好的答案。但是,爲了完整起見,我想提一下,在某些情況下,有一種方法可以在不重新索引數據的情況下進行。

如果speciesName字段存儲和查詢中產生相對較少的結果,你可以使用script_field檢索存儲的字段值:

curl -XGET http://my_server:9200/idx_occurrence/Occurrence/_search?pretty=true -d '{ 
    "query": { 
    "query_string": { 
     "fields": ["dataset"], 
     "query": "2", 
     "default_operator": "AND" 
    } 
    }, 
    "facets": { 
    "test": { 
     "terms": { 
     "script_field": "_fields['\''speciesName'\''].value", 
     "size": 50000 
     } 
    } 
    } 
} 
' 

由於此查詢的結果,elasticsearch將檢索speciesName場對於結果集中的每條記錄,它將根據這些值構建構面。不用說,如果您的結果集包含數百萬條記錄,則此查詢的性能可能會很低。

同樣,如果現場沒有存儲,但記錄源存儲,您可以使用script_field面從源中檢索字段值:

...... 
"script_field": "_source['\''speciesName'\'']", 
...... 

此外,源在結果列表中的每個記錄將被檢索和解析,所以你可能需要一些耐心在一大組記錄上運行這個查詢。

+0

+1我沒有想過這個解決方案,很好! – javanna

5

你的領域不應進行分析,或者至少不記號化。您需要更新您的映射,然後重新編制索引,如果您想對該字段進行索引而不對其進行標記。