【问题标题】:Programming language for 'dynamic' search?用于“动态”搜索的编程语言?
【发布时间】:2014-09-02 18:10:40
【问题描述】:

我是一个完全的初学者,所以如果这个问题的措辞可能不正确,或者我在某些事情上使用了错误的术语,请原谅。

我有一个 MS Word 文档,其中有四百条日记条目。我要编写的软件使用户能够在一个条目中搜索特定术语。所以我可能想要所有包含“快乐”和“悲伤”这两个词的日记条目。我想包括的另一个选项是搜索写在例如之间的所有日记条目。 2008年和2012年等

我希望搜索是“动态的”,从某种意义上说,用户可能会键入一个单词,并且在键入该单词时,结果表已经过滤了所有日记条目。因此,当用户输入单词时,表格会根据当前在搜索框中输入的内容发生变化。

这可能吗?这个功能到底叫什么?你会推荐我什么编程语言?我希望所有这些都在线,所以也许 php 或 ruby​​ 会有用?

【问题讨论】:

  • 听起来你需要解析文件(任何你喜欢的语言),存储在你可以索引和实现全文搜索的东西(SQL数据库和elasticsearch),并使用自动完成客户端搜索( JavaScript)。

标签: ruby-on-rails search dynamic


【解决方案1】:

您选择的 Ruby-on-Rails 很适合这个问题:

  1. 将每个日记条目存储为数据库条目
  2. 使用“全文搜索”搜索这些条目 - 无论是在数据库上还是在第三方上
  3. 用 JS 返回“实时”功能

MVC

Rails 使用MVC programming pattern 让您能够保存到数据库中。这很重要,因为如果您要在 Rails 中进行开发,则需要遵守 MVC 模式:

基本上,您将日记条目保存在database 中,使用controller 处理数据并使用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

--

全文搜索

当您将请求发送到您的控制器时,您处理搜索的方式将是在您的 Entry 模型中使用 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 或其他东西

--

“实时”搜索

您可以使用 Javascript 进行“实时”搜索(例如 here):

有一个number of tutorials 告诉您如何在线执行此操作 - 只需 Google live search railsautocomplete rails。但是,所有实现的原理基本相同:

  • JS 将捕获输入到搜索框中的文本
  • JS 向 Rails 控制器发送 Ajax 请求
  • 控制器向 ajax 发送响应
  • JS 响应并在屏幕上显示

注意这主要集中在 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);

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 2020-10-09
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 2011-06-06
    • 2018-01-05
    • 2014-01-01
    • 2019-12-22
    相关资源
    最近更新 更多