2017-03-05 11 views
1

とフレーズでワイルドカードを使用して、私はいくつかの値で始まる用語を一致させることができます:ここワイルドカード演算子を使用してElasticsearchクエリ文字列クエリ

{ 
    "query": { 
     "query_string" : { 
      "query" : "subject:cell*" 
     } 
    } 
} 

subjectフィールドがkeywordフィールドである(非分析しました)。これはうまくいきますが、 "cellular contr"で始まる用語を見つける方法を理解することはできません。二重引用符を試しても期待通りの結果が得られませんでした。

{ 
    "query": { 
     "query_string" : { 
      "query" : "subject:\"cellular contr*\"" 
     } 
    } 
} 

注:フレーズ検索は、完全一致でも正常に動作し、ワイルドカードでは正しく動作しません。私の推測では、星は二重引用符の中でワイルドカード演算子として解釈されないということです。あれは正しいですか?また、ワイルドカード演算子をフレーズで使用する他の方法はありますか?

注:照会はユーザー入力から行われるため、Query String Queryを使用する必要があります。

(私は正規表現に頼る可能性が知っているが、したくない)

答えて

0

はこのお試しください:

{ 
    "query": { 
     "query_string" : { 
      "query" : "subject:"cellular contr*", 
      "split_on_whitespace" : false 
     } 
    } 
} 
+0

デフォルト値は 'false'なので、明示的にfalseに設定しても違いはありません。しかし、私はちょうどそのために試してみました。それは "(subject:cellular)OR(contr *)"と解釈されています。私は 'analyze_wildcard'と' auto_generate_phrase_queries'を成功させることなく試してみました。(ドキュメントはちょっと薄いですが) – danmichaelo

1

EDIT: は、検索用のカスタムアナライザを定義します -

settings: 
    index: 
    analysis: 
     analyzer: 
     keyword_analyzer: 
      type: custom 
      tokenizer: keyword 
      filter: 
      - lowercase 

この場合、Prefix Queryを使用する必要があることがわかりました。なぜなら、クエリ文字列クエリは常にスペース上でセグメント化されるからですsを解析します。

ただし、このフィールドにlowecase filterを使用しており、プレフィックスクエリでアナライザをサポートしていないため、クエリーに追加する前にユーザー入力を小文字にする必要があります。

新しいクエリは次のようになります -

{ 
     "query": { 
      "prefix" : { 
       "subject" : "cellular contr" 
      } 
     } 
    } 

はまた、あなたがアナライザをサポートMatch Phrase Queryを使用することができます。カスタム・アナライザに加えて

{ 
    "query": { 
     "match_phrase_prefix" : { 
      "subject" : { 
       "query" : "Cellular contr", 
        "analyzer" : "keyword_analyzer", 
        "max_expansions" : 100 
       } 
       } 
     } 
    } 
+0

フレーズクエリが必要ない場合にはうまくいくでしょう。しかし、私は、 "cellular contr *"というクエリが "細胞質の制御"と一致することを望んでいません。そのため、フィールドを 'キーワード 'として索引付けしています。 – danmichaelo

+0

私はあなたの質問を誤解したと思います。 「分析していない」キーワードのフィールド 'subject'にクエリ文字列" cellular contr "を検索し、"細胞物質の制御 "の結果を取得するのは間違いありませんか? –

+0

いいえ、私が "cellular contr"を検索した場合、 "cellular control"にマッチさせたいが、 "cellular materialのコントロール"にはマッチさせない。だから私が欲しいのは本当に 'subject:/ cellular contr。* /'ですが、regexpは使用しません。 – danmichaelo

1

Hemedによって指さ、あなたは以下のように検索を実行する必要があるとして -

研究と試行の多くの後にそれを発見した
{ 
    "query": { 
     "query_string" : { 
      "query" : "subject:cellular\\ contr*" 
     } 
    } 
} 

を!

+0

このヒントありがとうございます! "\\"は、それがフレーズ内のスペースであることを弾力性に伝えており、検索された文字列の引用符を省略することができます。 – SeriousM

関連する問題