[Groonga-commit] groonga/groonga at 854b8e2 [master] mruby: support similar search with custom threshold

Back to archive index

Kouhei Sutou null+****@clear*****
Thu Sep 25 21:48:52 JST 2014


Kouhei Sutou	2014-09-25 21:48:52 +0900 (Thu, 25 Sep 2014)

  New Revision: 854b8e2089324325080190fdee390799a26466f2
  https://github.com/groonga/groonga/commit/854b8e2089324325080190fdee390799a26466f2

  Message:
    mruby: support similar search with custom threshold

  Modified files:
    lib/mrb/mrb_expr.c
    lib/mrb/scripts/scan_info.rb
    lib/mrb/scripts/scan_info_data.rb

  Modified: lib/mrb/mrb_expr.c (+27 -0)
===================================================================
--- lib/mrb/mrb_expr.c    2014-09-25 21:40:28 +0900 (2c4b5c5)
+++ lib/mrb/mrb_expr.c    2014-09-25 21:48:52 +0900 (3d0499c)
@@ -233,6 +233,29 @@ mrb_grn_scan_info_get_max_interval(mrb_state *mrb, mrb_value self)
 }
 
 static mrb_value
+mrb_grn_scan_info_set_similarity_threshold(mrb_state *mrb, mrb_value self)
+{
+  scan_info *si;
+  int similarity_threshold;
+
+  mrb_get_args(mrb, "i", &similarity_threshold);
+  si = DATA_PTR(self);
+  grn_scan_info_set_similarity_threshold(si, similarity_threshold);
+  return self;
+}
+
+static mrb_value
+mrb_grn_scan_info_get_similarity_threshold(mrb_state *mrb, mrb_value self)
+{
+  scan_info *si;
+  int similarity_threshold;
+
+  si = DATA_PTR(self);
+  similarity_threshold = grn_scan_info_get_similarity_threshold(si);
+  return mrb_fixnum_value(similarity_threshold);
+}
+
+static mrb_value
 mrb_grn_scan_info_get_arg(mrb_state *mrb, mrb_value self)
 {
   grn_ctx *ctx = (grn_ctx *)mrb->ud;
@@ -420,6 +443,10 @@ grn_mrb_expr_init(grn_ctx *ctx)
                     mrb_grn_scan_info_get_max_interval, MRB_ARGS_NONE());
   mrb_define_method(mrb, klass, "max_interval=",
                     mrb_grn_scan_info_set_max_interval, MRB_ARGS_REQ(1));
+  mrb_define_method(mrb, klass, "similarity_threshold",
+                    mrb_grn_scan_info_get_similarity_threshold, MRB_ARGS_NONE());
+  mrb_define_method(mrb, klass, "similarity_threshold=",
+                    mrb_grn_scan_info_set_similarity_threshold, MRB_ARGS_REQ(1));
   mrb_define_method(mrb, klass, "get_arg",
                     mrb_grn_scan_info_get_arg, MRB_ARGS_REQ(1));
   mrb_define_method(mrb, klass, "push_arg",

  Modified: lib/mrb/scripts/scan_info.rb (+3 -0)
===================================================================
--- lib/mrb/scripts/scan_info.rb    2014-09-25 21:40:28 +0900 (9977d9b)
+++ lib/mrb/scripts/scan_info.rb    2014-09-25 21:48:52 +0900 (cf0056d)
@@ -16,6 +16,9 @@ module Groonga
       if data.max_interval
         self.max_interval = data.max_interval
       end
+      if data.similarity_threshold
+        self.similarity_threshold = data.similarity_threshold
+      end
       data.args.each do |arg|
         push_arg(arg)
       end

  Modified: lib/mrb/scripts/scan_info_data.rb (+27 -0)
===================================================================
--- lib/mrb/scripts/scan_info_data.rb    2014-09-25 21:40:28 +0900 (87eb9ed)
+++ lib/mrb/scripts/scan_info_data.rb    2014-09-25 21:48:52 +0900 (67d0bc3)
@@ -9,6 +9,7 @@ module Groonga
     attr_accessor :indexes
     attr_accessor :flags
     attr_accessor :max_interval
+    attr_accessor :similarity_threshold
     def initialize(start)
       @start = start
       @end = 0
@@ -19,11 +20,14 @@ module Groonga
       @indexes = []
       @flags = ScanInfo::Flags::PUSH
       @max_interval = nil
+      @similarity_threshold = nil
     end
 
     def match_resolve_index
       if near_search?
         match_near_resolve_index
+      elsif similar_search?
+        match_similar_resolve_index
       else
         match_generic_resolve_index
       end
@@ -60,6 +64,29 @@ module Groonga
       self.max_interval = @args[2].value
     end
 
+    def similar_search?
+      @op == Operator::SIMILAR and****@args***** == 3
+    end
+
+    def match_similar_resolve_index
+      arg = @args[0]
+      case arg
+      when Expression
+        match_resolve_index_expression(arg)
+      when Accessor
+        match_resolve_index_accessor(arg)
+      when Object
+        match_resolve_index_db_obj(arg)
+      else
+        message =
+          "The first argument of SIMILAR must be Expression, Accessor or Object: #{arg.class}"
+        raise message
+      end
+
+      self.query = @args[1]
+      self.similarity_threshold = @args[2].value
+    end
+
     def match_generic_resolve_index
       @args.each do |arg|
         case arg
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index