2017-05-03 10 views
0

私たちはelastic-searchでフレーズを一致させたいユースケースを持っていますが、フレーズクエリに加えて、部分フレーズも検索したいと考えています。エラスティックサーチでフレーズを拡張可能な接頭辞と接尾辞に一致させるにはどうすればよいですか?

例:

検索フレーズ:「あなたを歓迎します」または「あなたをlcome」や「ヨーヨー歓迎」または「lcomeよ」これは、フレーズを含む文書に一致する必要があります:

「あなたは歓迎します」

01 "私たちはあなたを歓迎" "あなたは歓迎する" "私たちはあなたを歓迎"

つまり、部分的な部分文字列としてのフレーズと特定の設定可能な長さに拡張可能な接頭辞と接尾辞を含む結果をGoogleに返す機能を追加したフレーズクエリを実行して、単語の順序を維持したいとします。 弾性で私は何か 'match_phrase_prefix'のようなものを見つけましたが、特定の接頭辞で始まるフレーズにのみ一致します。 D接頭辞で始まる

例のリターン結果:

$ curl -XGET localhost:9200/startswith/test/_search?pretty -d '{ 
    "query": { 
     "match_phrase_prefix": { 
      "title": { 
       "query": "d", 
       "max_expansions": 5 
      } 
     } 
    } 
}' 

私も接尾辞のためにこれを達成できる方法はありますか?

答えて

1

shingle token filterをご覧になることを強くお勧めします。

インデックスを定義することができます。カスタムアナライザでは、サムリングを利用して、トークン自体に加えて一連の後続トークンを一緒に索引付けすることができます。例えば

curl -XPUT localhost:9200/startswith -d '{ 
    "settings": { 
     "analysis": { 
     "analyzer": { 
      "my_shingles": { 
      "tokenizer": "standard", 
      "filter": [ 
       "lowercase", 
       "shingles" 
      ] 
      } 
     }, 
     "filter": { 
      "shingles": { 
      "type": "shingle", 
      "min_shingle_size": 2, 
      "max_shingle_size": 2, 
      "output_unigrams": true 
      } 
     } 
     } 
    }, 
    "mappings": { 
    "test": { 
     "properties": { 
     "title": { 
      "type": "text", 
      "analyzer": "my_shingles" 
     } 
     } 
    } 
    } 
}' 

we welcome you toは、次のトークン

  • we
  • we welcome
  • welcome
  • welcome you
  • you
  • として索引付けされます
  • you to
  • to

は、その後、あなたは、インデックス、いくつかのサンプル文書ことができます。最後に

curl -XPUT localhost:9200/startswith/test/_bulk -d ' 
{"index": {}} 
{"title": "welcome you"} 
{"index": {}} 
{"title": "we welcome you"} 
{"index": {}} 
{"title": "welcome you to"} 
{"index": {}} 
{"title": "we welcome you to"} 
' 

、あなたはこのように、上記の4つのすべての文書を一致させるために、次のクエリを実行することができます:

curl -XPOST localhost:9200/startswith/test/_search -d '{ 
    "query": { 
     "match": {"title": "welcome you"} 
    } 
}' 

この方法は、よりも強力ですクエリーを使用すると、先頭または末尾のテキストの本文のどこにでも後続のトークンを一致させることができます。

+0

しかし、このソリューションでは、 "lcome you"のようなものを検索する際に、 "welcome"の部分文字列である "lcome"というトークンが見つかりません。 – user2530619

+1

申し訳ありませんが、部分一致が欲しいということは明確ではありませんでした。 'ngram'トークンフィルタをシングルワンの代わりに使うか補完することで解決策を改善することができます。 – Val

関連する問題