8

ElasticSearch を実行していますが、スペースを含む用語を検索するときに問題が発生しています。具体的な例: JM ブルーノという人物がいますが、これを検索しても結果は返されません。この正確な用語を検索すると結果が返されたことを漠然と覚えていますが、今は再現できません。

スペースと「\」をトークナイザー パターンに追加しようとしましたが、うまくいきませんでした。ES 設定は次のとおりです (Ruby on Rails アプリケーションで Tire gem を使用)

module Search
def self.included base
base.send :include, Tire::Model::Search
base.send :include, Tire::Model::Callbacks

base.class_eval do
  settings  analysis: {
              filter: {
                ngram: {
                  type: 'nGram',
                  max_gram: 12,
                  min_gram: 3
                },
                url_stop: {
                  type: "stop",
                  stopwords: %w[http https]
                }
              },
              tokenizer: {
                url_email_tokenizer: {
                  pattern: '[^\w\-\.@]+',
                  type: 'pattern'
                }
              },
              analyzer: {
                url_analyzer: {
                  tokenizer: "url_email_tokenizer",
                  filter: %w[url_stop ngram],
                  type: "custom"
                },
                name_analyzer: {
                  tokenizer: 'url_email_tokenizer',
                  filter: 'ngram',
                  type: 'custom'
                }
              }
            }


    end
  end
end

これらのトークナイザーを使用して、ドメイン名と電子メール アドレスも検索します。

4

5 に答える 5

4

フィールドに適用したアナライザーで_analyzeAPIを実行してみてください。

curl -XGET 'localhost:9200/_analyze?analyzer=name_analyzer' -d 'JM Bruno'

Elasticsearchがフィールドコンテンツをトークンに分割する方法と、TermQueryを使用して検索できない理由がわかります。TermQueryは分析されないため、クエリを転置インデックスとまったく同じように比較します。

于 2013-01-15T08:59:44.600 に答える
-1

私は同じ問題に遭遇しましたが、私が思いついたのは、スペース文字を「?」に置き換えることだけでした。ワイルドカード。デフォルトのトークナイザーと、クエリ文字列検索で特に要求していたトークナイザーが無視されたようです。

于 2014-05-29T19:40:48.233 に答える