2017-06-27 7 views
1

Elasticsearchでは、おそらくスペースを含む任意の部分文字列を検索するにはどうすればよいですか? (単語の一部を検索するだけでは十分ではありません;フィールド全体の部分文字列を検索したいのですが)textフィールドではなく、keywordフィールドになければならないと思います。Elasticsearchでは、どのように任意の部分文字列を検索しますか?

は、私は私のElasticsearchインデックスにわずか数千の文書があると、私は試してみてください。

"query": { 
     "wildcard" : { "description" : "*plan*" } 
    } 

期待通りに動作すること - 私のようなものも含め、「計画」は説明にあるすべてのアイテムを取得します"補充"。

今、私は他の多くの可能性の中で、「カプランではない」との文書を一致させる可能性があるように...

"query": { 
     "wildcard" : { "description" : "*plan is*" } 
    } 

をしたいと思います。

ワイルドカード、マッチプレフィックス、または他のどのような種類のクエリでもこれはできないようです。部分文字列を検索するにはどうすればよいですか? (SQLでは、私はちょうどdescription LIKE '%plan is%'を行うだろう)

(私はそのようなクエリは、大規模なデータセットのために低速またはおそらく不可能であろう認識しています。)

+0

別々の単語を検索するには、説明をトークン化する必要があります。彼らの文書を読んでください:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenizers.html – cheffe

+0

あなたが本当に冗長な部分文字列を検索したいのであれば、ngrams :https://www.elastic.co/guide/en/elasticsearch/guide/current/_ngrams_for_partial_matching.html – cheffe

+0

[ElasticSearchで単語の一部を検索する方法](https://stackoverflow.com/)の可能な複製質問/ 6467067 /エキスパート検索の方法の一部) – cheffe

答えて

1

この単純な部分文字列検索は非常に基本的な機能のように思えるので、このElasticsearchには何かが組み込まれていることが期待されていました(これについて考えると、実装されていますCではstrstr()、SQLではLIKE '%%'、ほとんどのテキストエディタではCtrl + F、C#ではString.IndexOfなど)が、これは当てはまりません。 regexpクエリは大文字小文字の区別をサポートしていないので、このカスタムアナライザと組み合わせてインデックスをすべて小文字にする必要があることに注意してください。次に、検索文字列を小文字に変換することができます。

​​

例クエリ:私を導くためのジャイ・シャルマへ

"query": { 
     "regexp" : { "description" : ".*plan is.*" } 
    } 

おかげ。私はちょうど詳細を提供したかった。

+1

これは正しいですが、フィールドが32766より長いと動作しません。 元のメッセージ:バイト数は最大で32766です。 32804 "、" causes_by ":{" type ":" max_bytes_length_exceeded_exception "、" reason ":"バイトの長さは最大で32766です。得た32804 回避策はありますか? – Baks

+0

これで分かりましたので、32K未満の値を残してください。私はそれがUTF-8であると仮定します。 –

+0

私はcan not ... theres多くの回避策が解決策ではありません。 – Baks

1

あなたはelasticsearchでregxp queryを試みたことがありますか?

+0

この単純な部分文字列検索は非常に基本的な機能のように思われるので、弾力性に優れたものがあると考えていました。 –

+0

この回答はパトリックにとって役に立ちましたか? –

関連する問題