1

がelasticSearchの私のフィールドである:ここではElasticSearchアナライザここ

"keywordName": { 
     "type": "text", 
     "analyzer": "custom_stop" 
     } 

は私のアナライザです:

"custom_stop": { 
     "type":  "custom", 
     "tokenizer": "standard", 
     "filter": [ 
     "my_stop", 
     "my_snow", 
     "asciifolding" 
     ] 
    } 

そして、ここでは私のフィルタは、次のとおりです。ここで

  "my_stop": { 
       "type":  "stop", 
       "stopwords": "_french_" 
      }, 
      "my_snow" : { 
       "type" : "snowball", 
       "language" : "French" 
      } 

は私です私の唯一のフィールド(keywordName)のインデックスを文書化します:

「canne a peche」、「canne」、「canne a peche telescopique」、「iphone 8」、「iphone 8 case」、「iphone 8 cover」、「iphone 8 charger」、「iphone 8 new」

私は「カンネ」を検索すると

、それは私が何をしたいです「カンネ」文書を、提供します:

GET ads/_search 
{ 
    "query": { 
    "match": { 
     "keywordName": { 
     "query": "canne", 
     "operator": "and" 
     } 
    } 
    }, 
    "size": 1 
} 

私は「カンネàPECHE」を検索すると、それは私に「カンネA PECHE」を与え、それもOKです。 「CannesàPêche」 - >「canne a peche」 - >「OK」と同じです。

「iphone 8」を検索すると、「iphone 8」の代わりに「iphone 8 cover」が表示されます。サイズを変更すると、5が設定されます(「iphone 8」を含む5つの結果が返されます)。私は "iphone 8"がスコアの点で4番目の結果であることを知っています。

{ 
    "took": 5, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 5, 
    "max_score": 1.4009607, 
    "hits": [ 
     { 
     "_index": "ads", 
     "_type": "keyword", 
     "_id": "iphone 8 cover", 
     "_score": 1.4009607, 
     "_source": { 
      "keywordName": "iphone 8 cover" 
     } 
     }, 
     { 
     "_index": "ads", 
     "_type": "keyword", 
     "_id": "iphone 8 case", 
     "_score": 1.4009607, 
     "_source": { 
      "keywordName": "iphone 8 case" 
     } 
     }, 
     { 
     "_index": "ads", 
     "_type": "keyword", 
     "_id": "iphone 8 new", 
     "_score": 0.70293105, 
     "_source": { 
      "keywordName": "iphone 8 new" 
     } 
     }, 
     { 
     "_index": "ads", 
     "_type": "keyword", 
     "_id": "iphone 8", 
     "_score": 0.5804671, 
     "_source": { 
      "keywordName": "iphone 8" 
     } 
     }, 
     { 
     "_index": "ads", 
     "_type": "keyword", 
     "_id": "iphone 8 charge", 
     "_score": 0.46705723, 
     "_source": { 
      "keywordName": "iphone 8 charge" 
     } 
     } 
    ] 
    } 
} 

どのようにすることができます:最初はここ

がクエリの結果です...その後 "iphone 8新しい" そして最後に "iphone 8" "iphone 8の場合、" その後 "iphone 8カバー" です私はキーワード "canne a peche"(アクセント、大文字、複数の用語)に関する柔軟性を保ちますが、完全一致( "iphone 8" = "iphone 8")があれば正確なkeywordNameを教えてください。

答えて

1

私はこのような何かを示唆:

"keywordName": { 
     "type": "text", 
     "analyzer": "custom_stop", 
     "fields": { 
     "raw": { 
      "type": "keyword" 
     } 
     } 
    } 

と問合せ:

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "match": { 
      "keywordName": { 
       "query": "iphone 8", 
       "operator": "and" 
      } 
      } 
     }, 
     { 
      "term": { 
      "keywordName.raw": { 
       "value": "iphone 8" 
      } 
      } 
     } 
     ] 
    } 
    }, 
    "size": 10 
} 
+0

これは私が探していた動作です! Thx – Gun

+0

「最も近いもの」の結果を増やすことは可能ですか?私が意味するのは、 - > "sâmsung"を検索すると、 "samsung"というトークンが1つあります。しかし、最高のスコアは「samsung galaxy」(1.11)、「samsung charger」(0.94)、「samsung」(0.84)です。私はそれが "sâmsung"に最も近いマッチングであるので、 "samsung"を後押しするようにどのように言えますか?そして、「samsung galaxy」や「samsung charger」ではなく、 – Gun

1

一致クエリでは、tf/idfアルゴリズムが使用されます。それは、あなたが頻繁に曖昧な検索結果を得ることを意味します。完全一致の場合に結果を得たい場合は、前にquery_stringの大文字小文字を作成し、結果がない場合は一致クエリを使用する必要があります。

+0

だから私は私の期待を満たすために2つのクエリを使用する必要がありますか? – Gun

+0

これは私がそれを見る方法です。私はまた、なぜiphone 8が4番目の結果であるのか理解していません。 tf/idfは最高の周波数を与えるはずです。 – RoiHatam

+0

@Gunはsize = 5の検索結果として表示できます – RoiHatam

関連する問題