私は多くのフィールドを持つ製品インデックスを持っています。特に、それらのすべてが形態と同義語フィルタで分析されています。第一クエリelasticsearch multi_match "AとB"の結果が "BとA"に等しくない
https://gist.github.com/anonymous/6e287d328a72df07bc491312820ffdef
:
GET /products/nms/_search
{
"size": 40,
"_source": {
"include": [
"_id"
]
},
"query": {
"multi_match": {
"fields": [
"subject.value^2",
"colors"
],
"minimum_should_match": "30%",
"operator": "and",
"query": "футболка белая",
"type": "cross_fields"
}
}
}
結果:ちょうど2つのフィールドのインデックスに簡略化
はここにある
"hits": {
"total": 6615,
"max_score": 9.118673,
そして、彼らは非常に正しいです。
しかし、私は、第二のクエリの単語を入れ替えるとき:
GET /products/nms/_search
{
"size": 40,
"_source": {
"include": [
"_id"
]
},
"query": {
"multi_match": {
"fields": [
"subject.value^2",
"colors"
],
"minimum_should_match": "30%",
"operator": "and",
"query": "белая футболка",
"type": "cross_fields"
}
}
}
私は取得しています:
"hits": {
"total": 145434,
"max_score": 10.683464,
をそして最初の結果、上位100のヒットではない単一のマッチに似たものはありません。
時間を費やしていましたが、解決策がまだありません。 私は文書構造(15フィールド以上)のためにcross_filedsを使用することを余儀なくされました。この場合、Elasticはあらゆるフィールドの同義語のヒットごとにカウントし、 "белая" )と "футболка"(t-シャツ)は何もありません。
は例えば、我々は4つのドキュメント
PUT products_color_test/nms/1
{
"colors": "белая", //white
"subject" : {
"id" :1,
"value": "футболка"} //t-shirt
}
PUT products_color_test/nms/2
{
"colors": "черная", //black
"subject" : {
"id" :1,
"value": "футболка"} //t-shirt
}
PUT products_color_test/nms/3
{
"colors": "молочная", //synonym to white
"subject" : {
"id" :1,
"value": "футболка"} //t-shirt
}
PUT products_color_test/nms/4
{
"colors": "молочная", //synonym to white
"subject" : {
"id" :2,
"value": "куртка"} //jacket
}
のは、それをテストしてみましょう
を持っています。GET /products_color_test/nms/_search
{
"size": 40,
"query": {
"multi_match": {
"fields": [
"subject.value^2",
"colors"
],
"minimum_should_match": "30%",
"operator": "and",
"query": "футболка белая",
"type": "cross_fields"
}
}
}
結果は次のとおりです。
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0.58422226,
"hits": [
{
"_index": "products_color_test",
"_type": "nms",
"_id": "3",
"_score": 0.58422226,
"_source": {
"colors": "молочная",
"subject": {
"id": 1,
"value": "футболка"
}
}
},
{
"_index": "products_color_test",
"_type": "nms",
"_id": "1",
"_score": 0.568724,
"_source": {
"colors": "белая",
"subject": {
"id": 1,
"value": "футболка"
}
}
}
]
}
}
ほとんどcorect、同義語ヒットではなく、正確なヒットのより高いスコアを取得します。
しかし、スワップ後:
GET /products_color_test/nms/_search
{
"size": 40,
"query": {
"multi_match": {
"fields": [
"subject.value^2",
"colors"
],
"minimum_should_match": "30%",
"operator": "and",
"query": "белая футболка",
"type": "cross_fields"
}
}
}
"hits": {
"total": 3,
"max_score": 0.58422226,
"hits": [
{
"_index": "products_color_test",
"_type": "nms",
"_id": "3",
"_score": 0.58422226,
"_source": {
"colors": "молочная",
"subject": {
"id": 1,
"value": "футболка"
}
}
},
{
"_index": "products_color_test",
"_type": "nms",
"_id": "1",
"_score": 0.568724,
"_source": {
"colors": "белая",
"subject": {
"id": 1,
"value": "футболка"
}
}
},
{
"_index": "products_color_test",
"_type": "nms",
"_id": "4",
"_score": 0.46449086,
"_source": {
"colors": "молочная",
"subject": {
"id": 2,
"value": "куртка" // jacket ----!!!!!----
}
}
}
]
}
}
質問:
- [OK]を、同義語はと同数をカウントします。しかし、なぜスコアリングが異なり、文の同義語候補のどの位置を取っているかによって異なります。
- クロスオーソライズされたドキュメント構造とmulti_matchクエリを保存して、シノニムのヒット数を1つだけカウントする方法はありますか?
ありがとう!
ps。私の英語