2017-06-03 13 views
0

私はES 5で作業しています。C#でNest 5を使用しています。 私のESソリューションのPersonのインデックスがあります。この人は、他の人の間に名字、姓のフィールドを持っています。スコア計算でテキストの長さを無視するElasticsearch

これらのフィールドでは、「トリム」トークンフィルタと「小文字」トークンフィルタを使用する「空白」トークナイザを使用しています。 私はこれらの2つのフィールドを見て検索を実装しました。私が持っている問題はスコアの計算です。これは、問題ilustrateするだけの例である:私は「ルーカス・ゴンザレス」 で検索する場合は

をそして、私は2つの文書を持っているところ

文献1: 姓=「ルーカス」 姓=「ペレス」

文献2: 姓=「ルーカスファンホセ」 氏名=「ゴンザレス・デ・ペレス・アルメイダ」、文書2は、2項(ルーカスとゴンザレス)最初のものであっても

が最初に戻ります。 kibanaの説明で質問を見ると、文書2の方がテキストの長さが長いためスコアが低くなっています。

私がやりたいことは、最初に、より多くの用語が一致し、テキストの長さ(または他の基準)がないことを取得することです。したがって、この例では、2番目の文書には「Lucas」と「Gonzales」に一致する2つの用語があるため、最初に戻る必要があります。

これを行うには良い方法がありますか?私の人物モデルには約20のプロパティがあり、クエリを高速に実行する必要があることを考慮に入れてください。

答えて

1

フィールドの長さの影響を排除するには、フィールドにnormsを無効にする必要があります。ここではマッピングの例です:

PUT my_index/_mapping/my_type 
{ 
    "properties": { 
     "firstName": { 
      "type": "text", 
      "norms": { 
       "enabled": false 
      } 
     }, 
     "lastName": { 
      "type": "text", 
      "norms": { 
       "enabled": false 
      } 
     } 
    } 
} 

または、NESTクライアントの場合は、ここで

class Sample 
{ 
    [Text(Norms = false)] 
    public string FirstName { get; set; } 

    [Text(Norms = false)] 
    public string LastName { get; set; } 
} 

client.CreateIndex(indexName, 
    create => create.Mappings(
     mappings => mappings.Map<Sample>(
      map => map.AutoMap() 
     ) 
    ) 
); 
をマッピング属性がある
関連する問題