1

これは非常に簡単な問題のように思えますが、他のソリューションや Web サイトから試したすべてが機能していません。:p_sインデックスまたはクエリを実行:genderしたくない 3 つのフィールドが:part_of_speechあります。この記事の中ほどで、インデックス作成について述べてnoいますが、これがどこで発生するかは示していません。

用語管理者:

  def search
    @terms = Term.search(params[:query]).page(params[:page])
  end

モデル:

require 'elasticsearch/model'

class Term < ActiveRecord::Base

include Elasticsearch::Model
include Elasticsearch::Model::Callbacks

  settings index: { number_of_shards: 1, number_of_replicas: 0 },
    do

    mappings dynamic: 'false' do
      indexes :id, index: :not_analyzed
      indexes :name, analyzer: :spanish_analyzer
      indexes :definition, analyzer: :combined_analyzer
      indexes :etymology1, analyzer: :combined_analyzer
      indexes :etymology2, analyzer: :combined_analyzer
      indexes :uses, analyzer: :combined_analyzer
      indexes :notes1, analyzer: :combined_analyzer
      indexes :notes2, analyzer: :combined_analyzer
    end
  end

  def self.search(query)
    __elasticsearch__.search(
      {
        query: {
          multi_match: {
            query: query,
            fields: ['name^7', 'definition^6', 'etymology1^5', 'etymology2^4', 'uses^3', 'notes1^2', 'notes2^1'],
            operator: 'and'
          }
        }
      }
    )
  end
end

# Delete the previous term index in Elasticsearch
Term.__elasticsearch__.client.indices.delete index: Term.index_name rescue nil

# Create the new index with the new mapping
Term.__elasticsearch__.client.indices.create \
  index: Term.index_name,
  body: { settings: Term.settings.to_hash, mappings: Term.mappings.to_hash }

# Index all term records from the DB to Elasticsearch
Term.import(force: true)
4

2 に答える 2

1

フィールドをインデックスなしとしてマークするには、次を使用します。

mappings dynamic: 'false' do
    ...
    indexes :p_s, index: :no
    indexes :gender, index: :no
    indexes :part_of_speech, index: :no
    ...
end

デフォルトでは、elasticsearch は"_source"キーの下にあるすべてのドキュメント フィールドを返します。特定のフィールドのみを取得するには、次のように最上位のクエリレベルfieldsで配列を指定できます。

def self.search(query)
    __elasticsearch__.search(
      {
        query: {
          multi_match: {
            query: query,
            fields: ['name^7', 'definition^6', 'etymology1^5', 'etymology2^4', 'uses^3', 'notes1^2', 'notes2^1'],
            operator: 'and'
          }
        },
        fields: ['name', 'definition', 'etymology1', 'etymology2', 'uses', 'notes1', 'notes2']
      }
    )
  end

またはフィルター"_source"

def self.search(query)
    __elasticsearch__.search(
      {
        query: {
          multi_match: {
            query: query,
            fields: ['name^7', 'definition^6', 'etymology1^5', 'etymology2^4', 'uses^3', 'notes1^2', 'notes2^1'],
            operator: 'and'
          }
        },
        '_source': ['name', 'definition', 'etymology1', 'etymology2', 'uses', 'notes1', 'notes2']
      }
    )
end

詳細については、Elasticsearch ソース フィルタリングのドキュメントを参照してください。

句を使用する場合multi_match、内側のfields要素は検索を実行するフィールドを指定し、オプションで例のようにブーストを指定します。外側fieldsの句または '_source' 句は、返すフィールドを決定し、これが目的のフィールドです。

Elasticsearch クエリのデバッグ中に何が起こっているかをよりよく把握するには、Senseなどのツールを使用します。必要な結果が得られたら、その逆よりもクエリを Ruby コードに転送する方がはるかに簡単な場合があります。

于 2016-06-24T19:10:12.397 に答える
0

含まれてelasticsearchいるメソッドを使用することは非常に理にかなっていると思います。ただし、私の場合、私のモデルでは、自分のケースに合わせて変更して、次のようなことを行いました。

def as_indexed_json
  as_json(only: [:id, :name, :definition, :etymology1, :etymology2, :uses, :notes1, :notes2])
end

デフォルトでは、Elasticsearch はas_indexed_jsonモデル内のメソッドを呼び出して、インデックスに必要なデータを取得するため、これは機能するはずです。

于 2016-06-24T18:58:47.177 に答える