1

私はまだ何か間違ったことをしています。誰か助けてくれませんか?Rails + Mongoid で ascii フィルターを使用したカスタム アナライザーを作成したいと考えています。フィールド名を持つ単純なモデル製品があります。

class Product
  include Mongoid::Document

  field :name

  settings analysis: {
      analyser: {
        ascii: {
          type: 'custom',
          tokenizer: 'whitespace',
          filter: ['lowercase','asciifolding']
        }
      }
   }

   mapping do
     indexes :name, analyzer: 'ascii'
   end

end

Product.create(name:"svíčka")
Product.search(q:"svíčka").count #1
Product.search(q:"svicka").count #0 can't find - expected 1

Product.create(name:"svicka")
Product.search(q:"svíčka").count #0 can't find - expected 1
Product.search(q:"svicka").count #1

そして、elasticsearch-head でインデックスを確認すると、この "svicka" のようなアクセントなしでインデックスが格納されていると予想していましたが、インデックスはこの "Svíčka" のように見えます。

私は何を間違っていますか?

APIで確認すると、問題ないようです:

curl -XGET 'localhost:9200/_analyze?tokenizer=whitespace&filters=asciifolding' -d 'svíčka'

{"tokens":[{"token":"svicka","start_offset":0,"end_offset":6,"type":"word","position":1}]}

http://localhost:9200/development_imango_products/_mapping
{"development_imango_products":{"product":{"properties":{"name":{"type":"string","analyzer":"ascii"}}}}}

curl -XGET 'localhost:9200/development_imango_products/_analyze?field=name' -d 'svíčka'
{"tokens":[{"token":"svicka","start_offset":0,"end_offset":6,"type":"word","position":1}]}
4

4 に答える 4

1

分析 APIを使用して、実際にドキュメントをどのようにインデックス化しているかを確認できます。

また、インデックスを作成するものと保存するものには違いがあることも考慮する必要があります。クエリを実行すると、保存したものが返されます。それはまさにelasticsearchに送信するものですが、インデックスを作成することで、クエリ中に返されるドキュメントが決まります。

asciifolding の使用はユースケースに適した選択です。svíčka または svicka を照会した結果が返されます。設定にタイプミスがあるだけだと思います: analysershould be analyzer. おそらく、そのアナライザーは期待どおりに使用されていません。

更新
あなたのコメントを考えると、あなたはまだ問題を解決していません。マッピングがどのように見えるか確認できますか ( localhost:9200/index_name/_mapping)? 分析 API を使用する方法は、テキスト分析チェーンを手動で提供しているため、それほど有用ではありませんが、チェーンがフィールドに期待どおりに適用されるという意味ではありません。次のようにフィールドの名前を指定するとよいでしょう。

curl -XGET 'localhost:9200/index_name/_analyze?field=field_name' -d 'svíčka'

そうすれば、分析 API はそのフィールドの実際のマッピングに依存します。

更新 2
マッピングが正しく送信され、すべてが正常に見えることを確認した後、クエリするフィールドを指定していないことに気付きました。指定しない場合は_all、インデックスを作成するすべてのフィールドがデフォルトで含まれ、デフォルトでStandardAnalyzer. 次のクエリを使用する必要があります: name:svíčka.

于 2012-10-19T15:56:48.850 に答える
0

Elasticsearchには、1回のAPI呼び出しで設定とマッピングが必要です。タイヤのドキュメントに記載されているかどうかはわかりませんが、タイヤのセットアップ時に設定とマッピングの両方を使用して、同様の問題に直面しました。以下が機能するはずです:

class Product
  include Mongoid::Document
  # include tire stuff

  field :name

  settings(self.tire_settings) do
    mapping do
      indexes :name, analyzer: 'ascii'
    end
  end

  # this method is just created for readablity, 
  # settings hash can also be passed directly
  def self.tire_settings
    {
      analysis: {
        analyzer: {
          ascii: {
            type: 'custom',
            tokenizer: 'whitespace',
            filter: ['lowercase','asciifolding']
          }
        }
      }
    }
  end
end
于 2012-10-20T22:35:49.857 に答える
0

タイヤから検索できるようにするには、モデルに 2 つの行を追加することが非常に重要であることに注意してください。モデルは次のようになります

  class Model
    include Mongoid::Document
    include Mongoid::Timestamps
    include Tire::Model::Search
    include Tire::Model::Callbacks

    field :filed_name, type: String

    index_name "#{Tire::Model::Search.index_prefix}model_name"
    settings :analysis => {
        :analyzer => {
            "project_lowercase_analyzer" => {
                "tokenizer" => "keyword",
                "filter"  =>  ["lowercase"],
                "type" => "custom"
                }
            },
        }  do
     mapping do
       indexes :field_name, :boost => 10, :type => 'String', :analyzer => 'standard', :filter => ['standard', 'lowercase','keyword']
       end
     end

    def self.search( params = {} )
      query = params[:search-text_field_name_from_form]
      Model.tire.search(load: true, page: params[:page], per_page: 5) do
      query { string query, default_operator: "AND" } if query.present?
    end
  end

index_name(一意である必要があります)とアナライザーを変更できます

そして、あなたのコントローラーは次のようになります

def method_name
  @results = Model.search( params ).results
end

ビューで @results を使用できます。これがお役に立てば幸いです。

于 2012-12-19T10:34:47.073 に答える
0
  1. @rubish が示唆するように、設定/マッピングの表記が正しくありません )

  2. 常に、常に、常にインデックスのマッピングをチェックして、目的のマッピングが適用されているかどうかを確認してください。

  3. @javanna が示唆するように、Explain API を使用して、ドキュメントを保存したり、結果を確認したりすることなく、分析チェーンがどのように機能するかをすばやく確認します。

于 2012-10-22T12:38:25.223 に答える