2017-10-07 15 views
0

필자는 공백을 포함 할 수있는 일련의 태그가있는 일련의 문서를 보유하고 있습니다. 사용자가 맞춤법이 틀린 태그 집합을 제공하고 일치하는 태그 중 가장 많은 수의 문서 (원하는 경우 가중치)를 찾으려합니다.JavaScript에서 가장 근접한 태그 세트 일치 검색 방법은 무엇입니까?

문서 당 수천 개의 문서와 태그가 있지만 최대 100 개의 태그가 있습니다.

자바 스크립트를 사용하여 검색이 클라이언트 측에서 완전히 이루어져야하지만 경량이며 성능이 뛰어난 솔루션을 찾고 있지만 node.js로 인덱스를 일부 사전 처리 할 수 ​​있습니다.

제 아이디어는 다중 세트를 사용하는 문서에 대한 역 색인 색인과 맞춤법이 틀린 태그의 올바른 철자를 찾는 퍼지 색인을 작성하는 것입니다.이 색인은 node.js의 전처리 단계에서 작성되어 JSON으로 직렬화됩니다. 파일. 검색 단계에서 쿼리의 각 항목에 대해 먼저 문의하여 가장 가능성있는 올바른 태그를 얻기 위해 퍼지 인덱스를 설정하고 역 색인을 참조하여 결과 집합을 가방 (번호가 매겨진 집합)에 추가하는 경우, . 모든 입력 태그에 대해이 작업을 수행 한 후 내림차순으로 정렬 된 가방의 내용이 가장 일치하는 문서를 제공해야합니다.

내 질문

  1. 이 일반적인 문제처럼 보인다, 내가 다시 사용할 수있는 그것에 대한 구현은 이미입니까? 나는 lunr.js와 fuse.js를 보았다. 그러나 그들은 다른 초점을 가진 것처럼 보인다.
    1. 문제에 대한 현명한 접근 방법입니까? 명백한 개선 사항이 있습니까?
    2. 퍼지 단계를 역 색인에서 분리하는 것이 더 좋습니까? 아니면이를 결합하는 방법이 있습니까?

      var documents = [{ 
          id: 1, tags: ["foo", "bar"], 
      },{ 
          id: 2, tags: ["hurp", "durp"] 
      }] 
      
      var idx = lunr(function (builder) { 
          builder.ref('id') 
          builder.field('tags') 
      
          documents.forEach(function (doc) { 
          builder.add(doc) 
          }) 
      }) 
      
      console.log(idx.search("fob~1")) 
      console.log(idx.search("hurd~2")) 
      

      이 Lunr의 기능 부부의 활용 :

답변

1

당신은 Lunr을 사용하여 원하는 것을 달성 할 수 있어야한다, 여기에 간단한 예 (그리고 jsfiddle)입니다 :

  1. 문서 필드가 배열 인 경우 Lunr은 요소가 이미 토큰 화되어 있다고 가정하므로 공백이있는 태그를 그대로 색인 할 수 있습니다 (예 : "foo ba r "이 하나의 태그로 처리됩니다 (원하는 경우 이것이 질문에서 명확하지 않음)
  2. 쿼리 문자열 형식을 사용하는 퍼지 검색이 지원됩니다. 물결표 뒤의 숫자가 최대 편집 거리이며 세부 사항에 들어가는 숫자는 documentation입니다.

결과는 쿼리와 가장 일치하는 문서별로 정렬됩니다. 간단히 말해 일치하는 태그가 더 많은 문서의 순위가 더 높습니다.

퍼지 단계를 역 색인에서 분리하는 것이 더 좋습니까? 아니면이를 결합하는 방법이 있습니까?

그 어느 때보 다 다릅니다. Lunr은 반전 된 인덱스 인 의 두 가지 데이터 구조를 유지합니다. 이 그래프는 와일드 카드 및 퍼지 매칭을 수행하는 데 사용됩니다.매칭과 관련이없는 역 색인의 용어에 대한 추가 정보를 저장하기 위해 별도의 데이터 구조를 유지합니다.

사용 사례에 따라 두 가지를 결합 할 수도 있지만 재미있는 방법은 저장하려는 데이터가 간단하면 흥미로운 방법으로 유한 상태 변환기를 사용하는 것입니다. 정수 (생각하는 문서 ID). Lunr에서 사용되는 것과 유사한이 데이터 구조에 대해 훌륭한 기사가 있습니다. - http://blog.burntsushi.net/transducers/