2015-12-24 59 views
1

我想達到的目標相匹配的所有方面:分析,並在相同的順序

文件:「一二三四」

搜索字符串:

  • 「四位一體」(絕比賽)
  • 「四位一體」(必須不匹配)

什麼我這麼遠瞭解到:

對於要考慮順序,在span_near查詢應該被使用,但這種假設條件已經由客戶分析(所有條款必須單獨提供)。

要分析搜索字符串,應該使用phrase_match查詢,但它不考慮順序。

這可能是一個腳本應該使用(謝謝@ ChintanShah25),但似乎不可能分析腳本內的輸入字符串。

如何實現分析和訂單要求?

回答

2

有沒有簡單的方法來做到這一點,你可以這樣做有兩種使用_analyze端點span queryscriptmatch_phrase

1)你通過搜索字符串_analyze

curl -XGET 'localhost:9200/_analyze' -d ' 
{ 
    "analyzer" : "my_custom_analyzer", 
    "text" : "one four" 
}' 

你會得到這樣的東西

{ 
    "tokens": [ 
     { 
     "token": "one", 
     "start_offset": 0, 
     "end_offset": 3, 
     "type": "<ALPHANUM>", 
     "position": 1 
     }, 
     { 
     "token": "four", 
     "start_offset": 4, 
     "end_offset": 8, 
     "type": "<ALPHANUM>", 
     "position": 2 
     } 
    ] 
} 

你然後將令牌傳遞到span query

{ 
    "span_near" : { 
     "clauses" : [ 
      { "span_term" : { "field" : "token1" } }, 
      { "span_term" : { "field" : "token2" } } 
     ], 
     "slop" : 2, 
     "in_order" : true, 
     "collect_payloads" : false 
    } 
} 

2)另一種方法是使用advanced scripting,看看@Andrei斯特凡爲this question答案,他用_POSITIONSmatch_phrase找回的條款結果爲了。

希望這會有所幫助!

+0

感謝您的回答。據我所知,@ AndreiStefan的解決方案要求在客戶端處理搜索字符串(標記),這是一個壞消息。我想我將不得不採用雙重請求解決方案。我可以編寫一個腳本來分析搜索字符串,並使用結果標記來完成Andrei Stefan的腳本的功能嗎? –

+0

@ AndreiStefan的解決方案是一個單一的請求解決方案,您只需將所有術語傳遞給腳本並比較它們的位置,這種解決方案的缺點是腳本可能會影響性能 – ChintanShah25