2017-04-20 52 views
0

Lunr在查找大多数结果方面做得非常好,但我无法弄清楚为什么它不返回包含在JSON数组中的多字字符串。为什么lunr不会在JSON数组中索引多个字符串?

下面是一个示例JSON文件,以获得我的数据是如何构成的意义:

[{ 
    "title": "Rolling Loud", 
    "date": "May 5–7", 
    "location": "Miami, FL, USA", 
    "rock-artists": [], 
    "hh-artists": ["Kendrick Lamar", "Future"], 
    "electronic-artists": [], 
    "other-artists": [] 
}] 

当我搜索“迈阿密”和“未来”,lunr返回节日。然而,当搜寻“肯德里克”或“肯德里克拉马尔”时,伦尔并没有回归节日。

相关代码:

// initialize lunr 
var idx = lunr(function() { 
    this.field('id'); 
    this.field('title', { boost: 3 }); 
    this.field('date'); 
    this.field('location'); 
    this.field('rockArtists', { boost: 3 }); 
    this.field('hhArtists', { boost: 3 }); 
    this.field('electronicArtists', { boost: 3 }); 
    this.field('otherArtists', { boost: 3 }); 

    // add festivals to lunr 
    for (var key in data) { 
     this.add({ 
      'id': key, 
      'title': data[key].title, 
      'date': data[key].date, 
      'location': data[key].location, 
      'rockArtists': data[key]['rock-artists'], 
      'hhArtists': data[key]['hh-artists'], 
      'electronicArtists': data[key]['electronic-artists'], 
      'otherArtists': data[key]['other-artists'] 
     }); 
    } 
}); 

谢谢!

+0

什么是'this'内'for..in'循环? – guest271314

+0

我不应该在函数中调用'add()'吗?我在循环之外调用'idx.​​add'时遇到了问题,所以我将它放在函数中,而不是通过'this'访问变量。 – Corbin

+0

'for..in'日志中的'console.log(this)'是什么? – guest271314

回答

1

Lunr 索引hh-artists场,你应该能够通过查找索引中的一个值来确认这一点:

idx.invertedIndex['Kendrick Lamar'] 

当文档领域是一个数组,lunr假设数组的元素已经被分割为标记用于索引。因此,不要将“Kendrick”和“Lamar”作为单独的标记添加到索引中,而是将“Kendrick Lamar”添加为单个标记。

尝试搜索的时候,因为搜索“肯德里克 - 拉马尔”,因为搜索字符串实际上是搜索“肯德里克”或“拉马尔”被分割在空间得到令牌这会导致问题。 “肯德里克”和“拉马尔”都没有在指数中,所以没有结果。

为了得到你所希望的,你可以将数组转换成字符串,让lunr手柄拆分为标记的结果:

this.add({ 
    'hhArtists': data[key]['hh-artists'].join(' ') 
}) 
相关问题