2011-12-20 148 views
10

在MySQL中我可以這樣做:彈性極限搜索結果

SELECT id FROM table WHERE field = 'foo' LIMIT 5 

如果表中有10,000行,那麼這個查詢方式比,如果我離開了限位件的方式更快。

在ElasticSearch,我有以下幾點:

{ 
    "query":{ 
     "fuzzy_like_this_field":{ 
      "body":{ 
      "like_text":"REALLY LONG (snip) TEXT HERE", 
      "max_query_terms":1, 
      "min_similarity":0.95, 
      "ignore_tf":true 
      } 
     } 
    } 
} 

當我運行該搜索,它需要幾秒鐘,而MySQL能夠在不遠的同一查詢返回的結果,更短的時間。

如果我傳入大小參數(設置爲1),它只能成功返回1個結果,但查詢本身不會比如果將大小設置爲無限制並返回所有結果更快。我懷疑查詢是完整運行的,查詢完成處理後只返回1個結果。這意味着「大小」屬性對我的目的沒用。

有沒有什麼辦法讓我的搜索一找到匹配模糊搜索的單個記錄就停止搜索,而不是在返回響應之前處理索引中的每條記錄?我誤解了一些更重要的東西嗎?

在此先感謝。

回答

9

你是對的,查詢正在完全運行。查詢默認返回按照分數排序的數據,因此您的查詢將對每個文檔進行評分。文檔指出fuzzy query不能很好地擴展,所以可能需要考慮其他查詢。

A limit filter可能會爲您尋找類似的行爲。

甲限制濾波器限制上

的文件來執行 數(每分片)要複製的MySQL field='foo'嘗試使用term filter。當你不關心評分時,你應該使用過濾器,它們更快並且可以緩存。