6

Elasticsearch CompletionSuggesterを実装する必要があります。

次のようにマップされたインデックスがあります。

{
  "user": {
    "properties": {
      "username": {
        "index": "not_analyzed",
        "analyzer": "simple",
        "type": "string"
      },
      "email": {
        "index": "not_analyzed",
        "analyzer": "simple",
        "type": "string"
      },
      "name": {
        "index": "not_analyzed",
        "analyzer": "simple",
        "type": "string"
      },
      "name_suggest": {
        "payloads": true,
        "type": "completion"
      }
    }
  }
}

次のようにドキュメントをインデックスに追加します。

{
  "doc": {
    "id": 1,
    "username": "jack",
    "name": "Jack Nicholson",
    "email": "nick@myemail.com",
    "name_suggest": {
      "input": [
        "jack",
        "Jack Nicholson",
        "nick@myemail.com"
      ],
      "payload": {
        "id": 1,
        "name": "Jack Nicholson",
        "username": "jack",
        "email": "nick@myemail.com"
      },
      "output": "Jack Nicholson (jack) - nick@myemail.com"
    }
  },
  "doc_as_upsert": true
}

そして、私はこのリクエストを次の宛先に送信しますmy_index/_suggest:

{
  "user": {
    "text": "jack",
    "completion": {
      "field": "name_suggest"
    }
  }
}

結果のオプションは次のようになります。

[
  {
    "text": "John Smith",
    "score": 1.0,
    "payload": {
      "id": 11,
      "name": "John Smith",
      "username": "jack",
      "email": "john@myemail.com"
    }
  },
  {
    "text": "Jack Nickolson",
    "score": 1.0,
    "payload": {
      "id": 1,
      "name": "Jack Nickolson",
      "username": "jack.n",
      "email": "nickolson@myemail.com"
    }
  },
  {
    "text": "Jackson Jermaine",
    "score": 1.0,
    "payload": {
      "id": 10,
      "name": "Jackson Jermaine",
      "username": "jermaine",
      "email": "jermaine@myemail.com"
    }
  },
  {
    "text": "Tito Jackson",
    "score": 1.0,
    "payload": {
      "id": 9,
      "name": "Tito Jackson",
      "username": "tito",
      "email": "jackson@myemail.com"
    }
  },
  {
    "text": "Michael Jackson",
    "score": 1.0,
    "payload": {
      "id": 6,
      "name": "Michael Jackson",
      "username": "michael_jackson",
      "email": "jackson_michael@myemail.com"
    }
  }
]

これはうまくいきますが、username一致したものが最初になるようにオプションをソートする必要があります。手動で行うことはできますが、それでは長さとオフセットを使用できなくなり、遅くなります。

個々の入力にスコアリングを追加することは可能ですか (全体が示唆するわけではありません)、その方法はソートに影響しますか? 私が使用するアプローチでは、そうではないようです。

別の関連する質問ですが、値の配列ではなくフィールドの配列を入力に指定して、重複を回避することは可能ですか? はいの場合、ES が提案を生成するときにフィールドのスコアの設定が考慮されますか?

4

1 に答える 1

1

重みオプションを使用して、入力にスコアを追加できます。

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters-completion.html#indexing

于 2014-04-03T12:55:54.850 に答える