2016-09-06 8 views
0

그리스어 단어에 대한 lunr에 새로운 형태소 분석기 기능을 등록하는 것이 예상대로 작동하지 않습니다. here은 codepen의 코드입니다. 어떤 오류도 발생하지 않고 있습니다. 별도로 사용할 경우 stemWord() 기능이 제대로 작동하지만 lunr의 단어를 줄이지 못합니다.lunr.js에 대한 그리스어 지원

function stemWord(w) { 
// code that returns the stemmed word 
}; 

// create the new function 
greekStemmer = function (token) { 
    return stemWord(token); 
}; 

// register it with lunr.Pipeline, this allows you to still serialise the index 
lunr.Pipeline.registerFunction(greekStemmer, 'greekStemmer') 

    var index = lunr(function() { 
    this.field('title', {boost: 10}) 
    this.field('body') 
    this.ref('id') 

    this.pipeline.remove(lunr.trimmer) // it doesn't work well with non-latin characters 
    this.pipeline.add(greekStemmer) 
    }) 

    index.add({ 
    id: 1, 
    title: 'ΚΑΠΟΙΟΣ', 
    body: 'Foo foo foo!' 
    }) 

    index.add({ 
    id: 2, 
    title: 'ΚΑΠΟΙΕΣ', 
    body: 'Bar bar bar!' 
    }) 


    index.add({ 
    id: 3, 
    title: 'ΤΙΠΟΤΑ', 
    body: 'Bar bar bar!' 
    }) 
+1

내가 Github 저장소에 문제로 게시하는 것이 좋습니다. – MEGADEVOPS

답변

1

lunr 형태소 분석기에서 파이프 라인 함수로 구현된다 아래 코드의 예이다. 파이프 라인 기능은 문서를 인덱싱 할 때 문서의 각 단어와 검색 할 때 검색 쿼리의 각 단어에 대해 실행됩니다.

파이프 라인에서 작동하는 함수의 경우 매우 간단한 인터페이스를 구현해야합니다. 단일 문자열을 입력으로 받아 들여야하며 문자열로 출력해야합니다.

은 그래서 매우 간단한 (그리고 쓸모없는) 파이프 라인 기능과 같을 것이다 다음

  1. :

    var simplePipelineFunction = function (word) { 
        return word 
    } 
    

    실제로 우리가이 일을하기 위해 필요한이 파이프 라인 기능을 사용하려면 파이프 라인 기능으로 등록하면 lunr이 파이프 라인을 직렬화 및 비 직렬화 할 수 있습니다.

  2. 인덱스 파이프 라인에 추가하십시오. 이 같은 보일 것

: 이제

// registering our pipeline function with the name 'simplePipelineFunction' 
lunr.Pipeline.registerFunction(simplePipelineFunction, 'simplePipelineFunction') 

var idx = lunr(function() { 
    // adding the pipeline function to our indexes pipeline 
    // when defining the pipeline 
    this.pipeline.add(simplePipelineFunction) 
}) 

, 당신은 위의 내용을 가지고, 우리의 파이프 라인 기능의 구현을 바꿀 수 있습니다. 영어 이외의 언어로 작업하는 lunr을 적응

var myGreekStemmer = function (word) { 
    // I don't know how to use the greek stemmer, but I think 
    // its safe to assume it won't be that different than this 
    return greekStem(word) 
} 

그냥 추가하는 것보다 더 많은 것을 필요로 : 그래서, 대신 단어 변경 반환하는, 당신이 어쩌면이 같은 단어를 막기 위해 발견 그리스 형태소 분석기를 사용할 수 있습니다 그래도 형용사. lunr의 기본 언어는 영어이므로 기본적으로 영어에 특화된 파이프 라인 기능을 포함합니다. 영어와 그리스어 당신은 아마 영어 기본값으로 인덱스 그리스어하려고 문제로 실행됩니다만큼 다른, 그래서 우리는 다음을 수행해야합니다

  1. 는 우리의 언어 별 형태소 분석기
  2. 제거와 기본 형태소 분석기를 교체 비 라틴 문자와 잘 맞지 않는 기본 트리머
  3. 기본 스톱 워드 필터를 대체/제거합니다. 영어 이외의 언어에서는 많이 사용되지 않을 것입니다.

트리머와 스톱 워드 필터는 파이프 라인 기능으로 구현되므로 특정 언어를 구현하면 스 트리머와 유사합니다.

그래서, 당신이있을 것입니다 그리스어에 대한 lunr 설정 : 당신은 훌륭한 lunr-languages 프로젝트에서 좀 걸릴 수 있습니다 좀 더 영감을

var idx = lunr(function() { 
    this.pipeline.after(lunr.stemmer, greekStemmer) 
    this.pipeline.remove(lunr.stemmer) 

    this.pipeline.after(lunr.trimmer, greekTrimmer) 
    this.pipeline.remove(lunr.trimmer) 

    this.pipeline.after(lunr.stopWordFilter, greekStopWordFilter) 
    this.pipeline.remove(lunr.stopWordFilter) 

    // define the index as normal 
    this.ref('id') 
    this.field('title') 
    this.field('body') 
}) 

를, 그것은 lunr에 대한 언어 확장을 만드는 많은 예제가 있습니다. 그리스어로 제출할 수도 있습니다.나뿐만 아니라 내가 생각으로 lunr.Pipeline API를 모르는처럼

편집 대신 우리는 단지 그것을 제거 후 제거하는 기능 후에 교체를 삽입하고, 더 replace 기능은 없다 보인다.

EDIT 미래에 다른 사람들을 돕기 위해 추가 ... 문제는 lunr 내의 토큰의 케이스까지 내려갔습니다. lunr은 모든 토큰을 소문자로 취급하려고합니다. 이것은 구성 가능성없이 tokenizer에 있습니다. 대부분의 언어 처리 기능의 경우 이것은 문제가되지 않지만 실제로 대부분의 경우에는 낮은 사례가 있다고 가정합니다. 이 경우, 그리스어 형태소 분석기는 그리스어에서 형태소 분석의 복잡성으로 인해 대문자 단어를 줄기 만합니다 (나는 그리스어 사용자가 아니기 때문에 형태소 분석이 얼마나 더 복잡한 지에 대해 언급 할 수 없습니다). 해결 방법은 그리스어 스 트리머를 호출하기 전에 대문자로 변환 한 다음 토큰을 나머지 파이프 라인으로 전달하기 전에 다시 소문자로 변환하는 것입니다.

+0

내 질문을 편집했습니다. 코드를 좀 살펴보실 수 있습니까? 형태소 분석기 자체는 작동하지만 lunr.js 파일에서 이와 같이 바꾸려고하면 작동하지 않습니다. –

+0

정확히 작동하지 않는 것은 무엇입니까? 어떤 오류가 있습니까? 그 정보없이 도움이되는 것은 조금 어렵습니다. –

+0

사용중인 코드로 내 질문을 업데이트했습니다. 오류는 없지만 단어가 줄기가없는 것으로 보입니다. 코드를보고 올바른지 말해 줄래? 또한이 문제를 디버깅 할 수있는 방법이 있습니까? lunr이 마지막으로 검색 한 단어는 console.log와 같습니다. –