1

Railsアプリで単語を検索するためにelasticsearch-railsとelasticsearch-model gemを使用しています。

これが私のモデル article.rb で、検索して実行したい場所です:

require 'elasticsearch/model'

class Article < ActiveRecord::Base
  include Elasticsearch::Model
  include Elasticsearch::Model::Callbacks

  def self.search(query)
    __elasticsearch__.search(
      {
        query: {
          multi_match: {
            query: query,
            fuzziness: 2,
            fields: ['title^10', 'text']
          }
        },
        highlight: {
          pre_tags: ['<em>'],
          post_tags: ['</em>'],
          fields: {
            title: {},

          }
        }
      }
    )
  end
end

これが私のモデルコントローラーsearch_controller.rbです

class SearchController < ApplicationController

  def search
    if params[:q].nil?
      @articles = []
    else
      @articles = Article.search params[:q]
      logger.info "LocationController.add_locations called with params: #{@articles.records.each_with_hit { |record, hit| puts "* #{record.title}: #{hit._score}" }}"
    end
  end
end

検索結果を取得しています。しかし、私の質問は次のとおりです。「ジョンチーム」を検索した場合。

Articles.search('John team').records.records

完全に一致する 'john team' と、'john' または 'team' に関連するいくつかの一致を含む複数のレコードを取得します。

しかし、「john team」がデータベースで完全に一致する場合、結果は john team のみである必要があります。別のレコードは必要ありません。しかし、「john team」が存在しない場合は、「john」または「 team' 両方のキーワード。

例:

Article.search('John team').records.records
responce: ('john team', 'team joy', 'John cena')

でも私はしたい

   Article.search('John team').records.records
    responce: ('john team')
4

1 に答える 1

0

単一の単語ではなく両方の単語に一致させたい場合は、これを試してください

  def self.search(query)
    __elasticsearch__.search(
      {
        query: {
          multi_match: {
            query:{ match: {content: {query: query, operator: "and" }}},
            fuzziness: 2,
            fields: ['title^10', 'text']
          }
        },
        highlight: {
          pre_tags: ['<em>'],
          post_tags: ['</em>'],
          fields: {
            title: {},

          }
        }
      }
    )
  end
于 2017-02-06T12:57:50.367 に答える