2017-11-13 5 views
2

Lucene.net을 사용하고 있으며 제품 데이터베이스의 항목 이름을 다르게하거나 철자를 다르게 지정할 수있는 경우 확장 조건을 제공하기 위해 SynonymFilter를 구현하려고합니다. "spanner"> "wrench"또는 "lawnmower"> "lawn mower"를 선택하십시오. SynonymMap 다음과 같이 테스트 I 설정으로Lucene.Net 여러 단어로 된 SynonymFilter

:

String base1 = "lawnmower"; 
String syn1 = "lawn mower"; 
String base2 = "spanner"; 
String syn2 = "wrench"; 

SynonymMap.Builder sb = new SynonymMap.Builder(true); 
sb.Add(new CharsRef(base1), new CharsRef(syn1), true); 
sb.Add(new CharsRef(base2), new CharsRef(syn2), true); 
SynonymMap smap = sb.Build(); 

"스패너"또는 "렌치"검색은에 두 단어로 다시 모든 조건을 제공합니다 검색을 "잔디 깎는 기계"또는 "잔디 깎는 기계"에 대해서만. 입력 검색 기준과 정확하게 일치하는 용어를 반환합니다.

동의어 내에서 여러 단어 구문을 처리해야하는 다른 것이 있습니까?

또한 어떻게 "lawnmower", "lawn mower", "mower", "grass cutter"와 같은 용어를 3 개 이상 확장 할 수 있습니까?

감사

답변

2

단위 테스트에서 여러 단어의 동의어의 an example 있습니다. 단어를 직접 나눠서 SynonymMap.WORD_SEPARATOR (null 문자)을 삽입해야합니다. 이를 쉽게 수행하기 위해 SynonymMap.BuilderJoin 방법이 있습니다.

다음은이 작업을 빠르게 수행 할 수있는 확장 방법입니다. 동의어가 공백이 있는지 여부

public static class SynonymMapBuilderExtensions 
{ 
    private static Regex Space = new Regex(" +", RegexOptions.Compiled); 

    public static void AddPhrase(this SynonymMap.Builder builder, string input, 
     string output, bool keepOrig) 
    { 
     CharsRef outputRef = builder.Join(Space.Split(output), new CharsRef()); 
     builder.Add(new CharsRef(input), outputRef, keepOrig); 
    } 
} 

는 그런 다음이 확장 방법을 사용할 수 있습니다, 당신은 당신이 당신의 코드에서 다른 곳을 필요로하지 않을 경우 CharsRef 개체를 만드는 귀찮게 할 필요가 없습니다.

String base1 = "lawnmower"; 
String syn1 = "lawn mower"; 
String base2 = "spanner"; 
String syn2 = "wrench"; 

SynonymMap.Builder sb = new SynonymMap.Builder(true); 
sb.AddPhrase(base1, syn1, true); 
sb.AddPhrase(base2, syn2, true); 
SynonymMap smap = sb.Build(); 
+0

감사합니다. 3 개 이상의 용어를 모두 모두 매핑하려면 "lawnmower", "lawn mower", "mower", "grass cutter"와 같이 3 개 이상의 용어로 어떻게 확장합니까? 각 대안 페이지를 서로 매핑해야합니까? – chilluk

+0

잘 모르겠지만 작동하는 유일한 방법은 합당한 것 같습니다. 모든 동의어를 목록에 추가 한 다음 [이 조합 확장 방법] (https://stackoverflow.com/a/32479803/)을 사용하여 모든 매핑을 추가하면 모든 조합을 더 간단하게 추가 할 수 있습니다. – NightOwl888

+0

그래서 a> b, b> a, a> c, c> a, b> c 및 c> b를 추가해야합니까? 내장 인덱스와 들어오는 쿼리 모두에서이 작업을 수행하려고합니까? 내 소스 데이터에서 나는 다른 용어의 변형을 가질 수 있으며 분명히 사람들이 그것을 검색 할 방법을 예측할 수는 없다. 또는 모든 대체 용어를 찾기 위해 쿼리를 처리하는 것만으로도 충분합니까? 동의어를 추가 할 때 원래 값을 유지합니까? 나는 최선의 접근 방식을 찾을 수 있도록 후드에서 무슨 일이 일어나고 있는지 알기 위해 무엇이 만들어지고 있는지 "볼 수 없다". – chilluk

관련 문제