2014-07-12 53 views
2

我是一個完整的初學者,所以請原諒,如果這個問題可能錯誤地措詞,或者我對某些事情使用錯誤的條款。'動態'搜索的編程語言?

我有一個MS Word文檔,其中有400個日記條目。我想寫的軟件使用戶可以在一個條目中搜索特定的條款。因此,我可能希望擁有包含「開心」和「悲傷」兩個詞的所有日記條目。我想包括的另一個選擇是搜索例如在2008和2012等。

我希望搜索是'動態的',用戶可以輸入一個單詞,當輸入單詞時,結果表已經過濾了所有的日記條目。因此,根據搜索框中正在輸入的內容,表格在用戶輸入單詞時發生變化。

這是可能的&這個功能到底叫什麼名字?你會推薦我什麼編程語言?我想所有這些在線,所以也許PHP或紅寶石會有用嗎?

+1

聽起來像是你需要分析的東西,你可以索引文件(你喜歡的任何語言),存儲和實現全文搜索(SQL數據庫和elasticsearch),並使用自動完成的客戶端搜索(JavaScript)。 –

回答

3

您選擇的Ruby-on-Rails的是傾向於針對此問題:

  1. 存儲每個日記條目作爲數據庫條目
  2. 使用「全文搜索」搜索這些條目 - 無論是在DB或第三方
  3. 返回 「活」 的功能與JS

MVC

Rails使用MVC programming pattern給你的能力來保存到數據庫中。

enter image description here

基本上,你把你的日記在database,使用controller操作:因爲如果你打算在軌道發展,你需要保持MVC模式這一點很重要數據&使用view來顯示數據:

#app/models/entry.rb 
Class Entry < ActiveRecord::Base 
    #-> stores & brings back the entry data 
end 

#app/controllers/entries_controller.rb 
Class EntriesController < ApplicationController 
    respond_to :js, :html, :json, only: :search 
    def index 
     @entries = Entry.all 
    end 

    def search 
     @entries = Entry.search params[:query] 
     respond_with @entries 
    end 
end 


#config/routes.rb 
resources :entries do 
    collection do 
     match :search, via [:get, :post] 
    end 
end 

-

全文檢索

當你發送請求到你的控制器,你會處理的搜索將在您的項目模型class method(也就是您從您的數據)的方式,無論是引用 -

#app/models/entry.rb 
Class Entry < ActiveRecord::Base 
    def self.search(query) 
     where("title LIKE '%#{query}%'") 
    end 
end 

您可以使用您正在使用full text search for the SQL變種,或者使用第三方搜索,像Solr什麼

-

「活」搜索

你可以得到(例如here) 「活」 的搜索使用JavaScript:

enter image description here

有關於如何做到這一點網上一個number of tutorials - 只是谷歌live search railsautocomplete rails。然而,原理是基本相同的所有的實現:

  • JS將捕獲文本輸入到搜索框中
  • JS發送Ajax請求到你的Rails控制器
  • 控制器發送響應阿賈克斯
  • JS需要響應&在屏幕上顯示

ñ otice如何這主要集中在JS元素?下面的代碼,我們使用:

#app/assets/javascripts/application.js 
//Livesearch 
    $(document).ready(function() { 

     var base_url = window.location.protocol + "//" + window.location.host; 

     $('#SearchSearch').searchbox({ 
      url: base_url + '/search/', 
      param: 'search', 
      dom_id: '#livesearch', 
      loading_css: '#livesearch_loading' 
     })  

    }); 

#app/assets/javascripts/livesearch.js 
// Author: Ryan Heath 
// http://rpheath.com 

(function($) { 
    $.searchbox = {} 

    $.extend(true, $.searchbox, { 
    settings: { 
     url: 'search', 
     param: 'search', 
     dom_id: '#livesearch', 
     minChars: 2, 
     loading_css: '#livesearch_loading', 
     del_id: '#livesearch_del' 
    }, 

    loading: function() { 
     $($.searchbox.settings.loading_css).show() 
    }, 

    idle: function() { 
     $($.searchbox.settings.loading_css).hide() 
    }, 

    start: function() { 
     $.searchbox.loading() 
     $(document).trigger('before.searchbox') 
    }, 

    stop: function() { 
     $.searchbox.idle() 
     $(document).trigger('after.searchbox') 
    }, 

    kill: function() { 
     $($.searchbox.settings.dom_id).fadeOut(50) 
     $($.searchbox.settings.dom_id).html('') 
     $($.searchbox.settings.del_id).fadeOut(100) 
    }, 

    reset: function() { 
     $($.searchbox.settings.dom_id).html('') 
     $($.searchbox.settings.dom_id).fadeOut(50) 
     $('#SearchSearch').val('') 
     $($.searchbox.settings.del_id).fadeOut(100) 
    }, 

    process: function(terms) { 

     if(/\S/.test(terms)) { 
      $.ajax({ 
        type: 'GET', 
        url: $.searchbox.settings.url, 
        data: {search: terms.trim()}, 
        complete: function(data) { 
         $($.searchbox.settings.del_id).fadeIn(50) 
         $($.searchbox.settings.dom_id).html(data.responseText) 

         if (!$($.searchbox.settings.dom_id).is(':empty')) { 
          $($.searchbox.settings.dom_id).fadeIn(100) 
         } 

         $.searchbox.stop(); 
        } 
       }); 
      return false; 
     }else{ 
      $.searchbox.kill(); 
     } 
    } 
    }); 



    $.fn.searchbox = function(config) { 
     var settings = $.extend(true, $.searchbox.settings, config || {}) 

     $(document).trigger('init.searchbox') 
     $.searchbox.idle() 

     return this.each(function() { 
      var $input = $(this) 

      $input 
      .keyup(function() { 
       if ($input.val() != this.previousValue) { 

        if(/\S/.test($input.val().trim()) && $input.val().trim().length > $.searchbox.settings.minChars){ 
         $.searchbox.start() 
         $.searchbox.process($input.val()) 
        }else{ 
         $.searchbox.kill() 
        } 

        this.previousValue = $input.val() 

       } 
      }) 
     }) 
    } 
})(jQuery);