2017-04-20 4 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 "마이애미"과 "미래"를 검색합니다. 그러나 "Kendrick"또는 "Kendrick Lamar"를 검색 할 때 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"가 단일 토큰으로 추가됩니다.

"Kendrick Lamar"검색은 토큰을 얻기 위해 검색 문자열이 공백으로 나뉘어져 있으므로 실제로 "Kendrick"또는 "Lamar"를 검색하기 때문에 검색 할 때 문제가 발생합니다. "Kendrick"이나 "Lamar"도 색인에 없으므로 결과가 없습니다.

당신이 토큰으로 lunr 핸들 분할을 문자열로 배열을 변환 할 수 있습니다 당신이 기대하는 결과를 얻을 수 :

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