3

lunr.js は、以下の形式のデータで魅力的に機能しました

[{
      'id': 1,
      'first_name': 'Joseph',
      'last_name': 'Williams',
      'email': 'jwilliams0@hud.gov',
      'gender': 'Male',
      'age': 94
    }, {
      'id': 2,
      'first_name': 'Christina',
      'last_name': 'Lawrence',
      'email': 'clawrence1@clickbank.net',
      'gender': 'Female',
      'age': 67
    }]

しかし、データが以下のような場合はそうではありません。

[{
      'id': { 'id': 614, 'value': 1 },
      'first_name': { 'id': 244, 'value': 'Johnny' },
      'last_name': { 'id': 724, 'value': 'Fields' },
      'email': { 'id': 567, 'value': 'jfields0@barnesandnoble.com' },
      'gender': { 'id': 220, 'value': 'Male' },
      'age': { 'id': 745, 'value': 18 }
    }, {
      'id': { 'id': 204, 'value': 2 },
      'first_name': { 'id': 163, 'value': 'Kathy' },
      'last_name': { 'id': 991, 'value': 'Gilbert' },
      'email': { 'id': 453, 'value': 'kgilbert1@over-blog.com' },
      'gender': { 'id': 184, 'value': 'Female' },
      'age': { 'id': 337, 'value': 50 }
    }]

データを機能させるためにデータにインデックスを付ける方法に関するヒント。

4

1 に答える 1

3

lunr に追加されたドキュメントは、回答の最初のセクションにある形式のような形式である必要があります。データに他の構造がある場合は、lunr が理解できるものに変換する必要があります。

インデックス定義が次のようになっていると仮定します。

var idx = lunr(function () {
  this.ref('id')
  this.field('first_name')
  this.field('last_name')
  this.field('email')
  this.field('gender')
  this.field('age')
})

次に、ドキュメントをインデックスに追加する前に、次のような関数を使用してドキュメントをマップする必要があります。

var mapDocument = function (doc) {
  return Object.keys(doc).reduce(function (memo, key) {
    memo[key] = doc[key].value
    return memo
  }, {})
}

この関数は文書全体を効果的に平坦化します。実際に文書から引き出すフィールドを制限したい場合がありますが、うまくいけばアイデアが得られます。上記の関数は、ドキュメントを次から変換します。

  {
    'id': { 'id': 614, 'value': 1 },
    'first_name': { 'id': 244, 'value': 'Johnny' },
    'last_name': { 'id': 724, 'value': 'Fields' },
    'email': { 'id': 567, 'value': 'jfields0@barnesandnoble.com' },
    'gender': { 'id': 220, 'value': 'Male' },
    'age': { 'id': 745, 'value': 18 }
  }

lunr が理解できるものに:

  {
    'id': 1,
    'first_name': 'Johnny',
    'last_name': 'Fields',
    'email': 'jfields0@barnesandnoble.com',
    'gender': 'Male',
    'age': 18
  }
于 2016-07-16T19:27:11.317 に答える