2016-03-07 45 views
0

我正在使用elasticsearch 1.7,並且需要使用匹配的query_string查詢的哪些部分來標記文檔。ElasticSearch:爲搜索項匹配標籤文檔

我一直在試着突出顯示,但發現它在某些情況下會變得有些混亂。我很想將文檔標記爲匹配的搜索字詞。

下面是我使用的查詢:(注意,這是後來被編碼爲JSON紅寶石哈希)

{ 
    query: { 
    query_string: { 
     fields: ["title^10", "keywords^4", "content"], 
     query: query_string, 
     use_dis_max: false 
    } 
    }, 
    size: 20, 
    from: 0, 
    sort: [ 
    { pub_date: { order: :desc }}, 
    { _score: { order: :desc }} 
    ] 
} 

query_string變量是基於用戶關閉跟着主題,可能是這個樣子:"(the AND walking AND dead) OR (iphone) OR (video AND games)"

是否有任何選擇,我可以使用,使文件返回將有一個物業配套像the walking dead(the AND walking AND dead)

+0

您是否可以將頂級OR查詢分隔爲多個「bool/should」子查詢? – Val

+0

我最初使用一個bool查詢與應子查詢。但是,有些用戶會遵循50多個主題,因此JSON查詢變得相當大,並且會降低速度。特別是因爲我每學期需要3個查詢(檢查每個字段)。 – Reizar

+0

如果我要切換到使用bool/should(只是做了一些測試,看起來像大量的子查詢還是比較快的)。這將如何完成?謝謝 – Reizar

回答

2

一個搜索詞。如果喲我們準備切換到使用bool/should查詢,您可以在每個字段上拆分匹配並使用named queries,然後在結果中您將獲得匹配的查詢的名稱。

它去基本上是這樣的:在一個bool/should查詢,你添加一個query_string查詢每場並命名查詢,以便確定該字段(如title_querytitle場等)

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "query_string": { 
      "fields": [ 
       "title^10" 
      ], 
      "query": "query_string", 
      "use_dis_max": false, 
      "_name": "title_query" 
      } 
     }, 
     { 
      "query_string": { 
      "fields": [ 
       "keywords^4" 
      ], 
      "query": "query_string", 
      "use_dis_max": false, 
      "_name": "keywords_query" 
      } 
     }, 
     { 
      "query_string": { 
      "fields": [ 
       "content" 
      ], 
      "query": "query_string", 
      "use_dis_max": false, 
      "_name": "content_query" 
      } 
     } 
     ] 
    } 
    } 
} 

在結果,你會得到_source另一個名爲matched_queries的數組,其中包含與返回文檔相匹配的查詢名稱。

"_source": { 
    ... 
}, 
"matched_queries": [ 
    "title_query" 
], 
+0

非常感謝。這正是我想要的。 – Reizar

+0

真棒,很高興它爲你工作! – Val