2013-09-07 36 views
5

nGramsや同義語のような機能を利用しようとしていますが、運が上がらないのです。ElasticSearch部分検索の一致

私はthis blog postに従っています。私はマッピングとクエリを自分のデータに適応させようとしましたが、正確な用語にしかマッチしません。また、同じ結果を持つthis gistの記事の正確なデータを使ってみました。ここで

はマッピングです:

{ 
    "mappings": { 
     "item": { 
     "properties": { 
      "productName": { 
       "fields": { 
        "partial": { 
        "search_analyzer":"full_name", 
        "index_analyzer":"partial_name", 
        "type":"string" 
        }, 
        "partial_back": { 
        "search_analyzer":"full_name", 
        "index_analyzer":"partial_name_back", 
        "type":"string" 
        }, 
        "partial_middle": { 
        "search_analyzer":"full_name", 
        "index_analyzer":"partial_middle_name", 
        "type":"string" 
        }, 
        "productName": { 
        "type":"string", 
        "analyzer":"full_name" 
        } 
       }, 
       "type":"multi_field" 
      }, 
      "productID": { 
       "type":"string", 
       "analyzer":"simple" 
      }, 
      "warehouse": { 
       "type":"string", 
       "analyzer":"simple" 
      }, 
      "vendor": { 
       "type":"string", 
       "analyzer":"simple" 
      }, 
      "productDescription": { 
       "type":"string", 
       "analyzer":"full_name" 
      }, 
      "categories": { 
       "type":"string", 
       "analyzer":"simple" 
      }, 
      "stockLevel": { 
       "type":"integer", 
       "index":"not_analyzed" 
      }, 
      "cost": { 
       "type":"float", 
       "index":"not_analyzed" 
      } 
     } 
     }, 
     "settings": { 
     "analysis": { 
      "filter": { 
       "name_ngrams": { 
        "side":"front", 
        "max_gram":50, 
        "min_gram":2, 
        "type":"edgeNGram" 
       }, 
       "name_ngrams_back": { 
        "side":"back", 
        "max_gram":50, 
        "min_gram":2, 
        "type":"edgeNGram" 
       }, 
       "name_middle_ngrams": { 
        "type":"nGram", 
        "max_gram":50, 
        "min_gram":2 
       } 
      }, 
      "analyzer": { 
       "full_name": { 
        "filter":[ 
        "standard", 
        "lowercase", 
        "asciifolding" 
        ], 
        "type":"custom", 
        "tokenizer":"standard" 
       }, 
       "partial_name": { 
        "filter":[ 
        "standard", 
        "lowercase", 
        "asciifolding", 
        "name_ngrams" 
        ], 
        "type":"custom", 
        "tokenizer":"standard" 
       }, 
       "partial_name_back": { 
        "filter":[ 
        "standard", 
        "lowercase", 
        "asciifolding", 
        "name_ngrams_back" 
        ], 
        "type":"custom", 
        "tokenizer":"standard" 
       }, 
       "partial_middle_name": { 
        "filter":[ 
        "standard", 
        "lowercase", 
        "asciifolding", 
        "name_middle_ngrams" 
        ], 
        "type":"custom", 
        "tokenizer":"standard" 
       } 
      } 
     } 
     } 
    } 
} 

検索クエリ(私はより多くの結果を返すようにしようとするフィルタを削除):

I場合は、上記の趣旨からクエリを使用して
{ 
    "size":20, 
    "from":0, 
    "sort":[ 
     "_score" 
    ], 
    "query": { 
     "bool": { 
     "should":[ 
      { 
       "text": { 
        "productName": { 
        "boost":5, 
        "query":"test query", 
        "type":"phrase" 
        } 
       } 
      }, 
      { 
       "text": { 
        "productName.partial": { 
        "boost":1, 
        "query":"test query" 
        } 
       } 
      }, 
      { 
       "text": { 
        "productName.partial_middle": { 
        "boost":1, 
        "query":"test query" 
        } 
       } 
      }, 
      { 
       "text": { 
        "productName.partial_back": { 
        "boost":1, 
        "query":"test query" 
        } 
       } 
      } 
     ] 
     } 
    } 
} 

最初のboolクエリから次のコードを削除します。

したがって、直接一致を返しません。n私の検索用語は何でも、私はまだ結果を返しません。

私は何かが目立つように見えていないと思うし、他の情報が何であるか本当に分かっていないと思います。

+0

マッピングを投稿してください。 'curl http:// domain.com/index/type/_mapping'正しく設定されていることを確認するだけです。 – ramseykhalaf

+1

また、 'text'は推奨されません、' match'を使用してください! – ramseykhalaf

+0

@ramseykhalafあなたはこれをちょうど解決しました、私は前にマッピングを引っ張ってjsonを見て、それが正しいと仮定しましたが、実際にそれを見て、それはすべてが乱れていたことに気付きました。私は書いた答えにあなたを信用します! – Rockstar04

答えて

5

盲目的にコピーして貼り付ける、私の問題に対する答えを見つけたように見えます。私がリンクしたブログの記事は古くなっているようですが、コマンド用のJSONは正しく動作しません(しかし、コマンドを送信するときにエラーが発生しません)。ここ

は私が使用されるインデックスを作成するためのコードは次のとおり

{ 
    "settings": { 
     "analysis": { 
     "filter": { 
      "name_ngrams": { 
       "side":"front", 
       "max_gram":50, 
       "min_gram":2, 
       "type":"edgeNGram" 
      }, 
      "name_ngrams_back": { 
       "side":"back", 
       "max_gram":50, 
       "min_gram":2, 
       "type":"edgeNGram" 
      }, 
      "name_middle_ngrams": { 
       "type":"nGram", 
       "max_gram":50, 
       "min_gram":2 
      } 
     }, 
     "analyzer": { 
      "full_name": { 
       "filter":[ 
        "standard", 
        "lowercase", 
        "asciifolding" 
       ], 
       "type":"custom", 
       "tokenizer":"standard" 
      }, 
      "partial_name": { 
       "filter":[ 
        "standard", 
        "lowercase", 
        "asciifolding", 
        "name_ngrams" 
       ], 
       "type":"custom", 
       "tokenizer":"standard" 
      }, 
      "partial_name_back": { 
       "filter":[ 
        "standard", 
        "lowercase", 
        "asciifolding", 
        "name_ngrams_back" 
       ], 
       "type":"custom", 
       "tokenizer":"standard" 
      }, 
      "partial_middle_name": { 
       "filter":[ 
        "standard", 
        "lowercase", 
        "asciifolding", 
        "name_middle_ngrams" 
       ], 
       "type":"custom", 
       "tokenizer":"standard" 
      } 
     } 
     } 
    }, 
    "mappings" : { 
     "product": { 
     "properties": { 
      "productName": { 
       "fields": { 
        "partial": { 
        "search_analyzer":"full_name", 
        "index_analyzer":"partial_name", 
        "type":"string" 
        }, 
        "partial_back": { 
        "search_analyzer":"full_name", 
        "index_analyzer":"partial_name_back", 
        "type":"string" 
        }, 
        "partial_middle": { 
        "search_analyzer":"full_name", 
        "index_analyzer":"partial_middle_name", 
        "type":"string" 
        }, 
        "productName": { 
        "type":"string", 
        "analyzer":"full_name" 
        } 
       }, 
       "type":"multi_field" 
      }, 
      "productID": { 
       "type":"string", 
       "analyzer":"simple" 
      }, 
      "warehouse": { 
       "type":"string", 
       "analyzer":"simple" 
      }, 
      "vendor": { 
       "type":"string", 
       "analyzer":"simple" 
      }, 
      "productDescription": { 
       "type":"string", 
       "analyzer":"full_name" 
      }, 
      "categories": { 
       "type":"string", 
       "analyzer":"simple" 
      }, 
      "stockLevel": { 
       "type":"integer", 
       "index":"not_analyzed" 
      }, 
      "cost": { 
       "type":"float", 
       "index":"not_analyzed" 
      } 
     } 
     } 
    } 
} 

ここでは、テスト記録(私はわずかに変更されたデータを用いて、この3回使用)

{ 
    "productName": "Thingey", 
    "productID": "asdfasef9816", 
    "warehouse": "usa", 
    "vendor": "Cool Things Inc", 
    "productDescription": "This is a cool gizmo", 
    "categories": "Cool Things", 
    "stockLevel": 6, 
    "cost": 15.31 
} 
を挿入するために使用されるコードであります

最後に検索クエリのJSON。

{ 
    "size":20, 
    "from":0, 
    "sort":[ 
     "_score" 
    ], 
    "query": { 
     "bool": { 
     "should":[ 
      { 
       "text": { 
        "productName.partial": { 
        "boost":1, 
        "query":"ing" 
        } 
       } 
      }, 
      { 
       "text": { 
        "productName.partial_middle": { 
        "boost":1, 
        "query":"ing" 
        } 
       } 
      }, 
      { 
       "text": { 
        "productName.partial_back": { 
        "boost":1, 
        "query":"ing" 
        } 
       } 
      } 
     ] 
     } 
    } 
} 

重要な変更は、設定をマッピングPUTからインデックス作成に移動することでした。私はここでも最初のマッピング定義を移動しましたが、通常の/ index/item/_mapping PUTを使用して作成できました。

ElasticSearchのいずれかのプロフェッショナルがこの問題の今後の読者のためにこれを展開したい場合は、こちらをご覧ください。

+0

私はこの回答を私の特定の問題を解決するとして受け入れるつもりですが、この回答に追加してより良くすることができる人はどうぞ! – Rockstar04

関連する問題