1

環境

基本的に、私が持っているのは、pty_firstname と pty_surname に分割された名前の大規模なデータセットです。このデータを Informix DB から ElasticSearch にインデックス付けすると、すべて正常に動作します。ただし、私が達成できていないのは、このテーブル構造の論理マッピングと、マッピングの恩恵を受けるクエリです。私が問題を抱えていると思われるのは、名前が実際には2つの列に分割されているため、クエリが適切な結果セットを返すのが少し難しいことです。

誰かが私に助けを与えることができれば、完全一致ではないにしても最も近い結果セットを一番上に返し、結果セットを進めるにつれて結果の類似性が低くなります。

マッピング

ここでマッピングとクエリのインスピレーションを得ようとしましたが、いくつかの変更を加えましたが、必要な/望む結果が得られないようです - http://goo.gl/hm9ISL

{
   "mappings":{
      "user":{
         "properties":{
            "pty_forename":{
               "type":"multi_field",
               "fields":{
                  "name":{
                     "type":"string",
                     "index":"analyzed"
                  },
                  "exact":{
                     "type":"string",
                     "index":"not_analyzed"
                  }
               }
            },
            "pty_surname":{
               "type":"multi_field",
               "fields":{
                  "name":{
                     "type":"string",
                     "index":"analyzed"
                  },
                  "exact":{
                     "type":"string",
                     "index":"not_analyzed"
                  }
               }
            },
            "pty_minute_ref":{
               "type":"integer",
               "index":"not_analyzed"
            },
            "pty_deed_code":{
               "type":"string",
               "index":"not_analyzed"
            },
            "pty_name_prefix":{
               "type":"string",
               "index":"not_analyzed"
            },
            "pty_name_suffix":{
               "type":"string",
               "index":"not_analyzed"
            },
            "pty_address":{
               "type":"string",
               "index":"not_analyzed"
            },
            "pty_desig_suffix":{
               "type":"string",
               "index":"not_analyzed"
            },
            "pty_mc_ind":{
               "type":"string",
               "index":"not_analyzed"
            },
            "pty_of_ind":{
               "type":"string",
               "index":"not_analyzed"
            },
            "pty_or_ind":{
               "type":"integer",
               "index":"not_analyzed"
            },
            "pty_date_entered":{
               "type":"basic_date",
               "index":"not_analyzed"
            },
            "pty_data":{
               "type":"string",
               "index":"not_analyzed"
            },
            "pty_type":{
               "type":"string",
               "index":"not_analyzed"
            }
         }
      }
   }
}

クエリ

{
   "query":{
      "bool":{
         "must":[
            {
               "multi_match":{
                  "query":"Nathan Smith",
                  "fields":[
                     "pty_forename",
                     "pty_surname"
                  ]
               }
            }
         ],
         "should":[
            {
               "term":{
                  "pty_forename.exact":{
                     "value":"Nathan Smith",
                     "boost":15
                  }
               }
            },
            {
               "prefix":{
                  "pty_forename.exact":{
                     "value":"Nathan Smith",
                     "boost":10
                  }
               }
            },
            {
               "match_phrase":{
                  "pty_forename":{
                     "query":"Nathan Smith",
                     "slop":0,
                     "boost":5
                  }
               }
            }
         ]
      }
   }
}

結論

私が取得している結果セットは、両方のフィールド、つまり pty_forename と pty_surname でクエリを実行しておらず、Nathan などの姓を持つ人を返しています。どんな助けでも大歓迎です。

更新 - Gist へのリンク

要点へのリンク

4

2 に答える 2

1
  1. リンクしたStackOverflowの例とelasticsearch Multifieldのドキュメントの「フィールドへのアクセス」という見出しの下で、 multi_field タイプの「フィールド」の下にリストされている最初のフィールドは、フィールド自体と同じ名前にする必要があります。したがって、SO およびドキュメントの例では、「name」は multi_type フィールドの名前であるため、「name」は「fields」の下に指定された最初の名前です。あなたの例では、マッピングは

        "pty_forename":{
           "type":"multi_field",
           "fields":{
              "pty_forename":{
                 "type":"string",
                 "index":"analyzed"
              },
              "exact":{
                 "type":"string",
                 "index":"not_analyzed"
              }
           }
        },
        "pty_surname":{
           "type":"multi_field",
           "fields":{
              "pty_surname":{
                 "type":"string",
                 "index":"analyzed"
              },
              "exact":{
                 "type":"string",
                 "index":"not_analyzed"
              }
           }
        },
    

    現在のマッピングでは、「bool」「must」クエリは何も実行していない可能性があります。現在、「pty_forename」または「pty_surname」という名前の multi_field 「フィールド」がないためです。「フィールド」セクションでその名前を使用していなくても、Elasticsearch がまだその名前で multi_field を保存しているかどうかがわからないため、可能性があると言います。

  2. femtoRgonが示唆するように、おそらく次のように、「bool」「should」クエリは「pty_forename」と「pty_surname」の両方を検索する必要があります。

    
          "multi_match" : {
                "fields" : ["pty_forename.exact", "pty_surname.exact"],
                "value" : "Nathan Smith",
                "type" : "term"
          },
         "multi_match" : {
                "fields" : ["pty_forename.exact", "pty_surname.exact"],
                "value" : "Nathan Smith",
                "type" : "prefix"
          },
          "multi_match" : {
                "fields" : ["pty_forename.exact", "pty_surname.exact"],
                "query" : "Nathan Smith",
                "slop":0,
                "boost":5,
                "type" : "match_phrase"
          }
     

ここで javana の回答を見ましたElasticsearch phrase prefix query on multiple fields

于 2013-08-13T19:47:24.173 に答える
1

このようなものはあなたが探しているものですか?

"bool" : {
    "should" : {
        "match" : { "pty_forename" : "nathan" }
    },
    "should" : {
        "match" : { "pty_surname" : "smith" }
    }
}

つまり、すべてpty_forename= "nathan" OR pty_surname= "smith" の結果になります (両方のスコアが高くなります)。

于 2013-08-13T19:20:17.640 に答える