2011-01-14 3 views
3

Lucene.Net을 사용하여 검색 기능을 구현했습니다. 이 지수에는 "A Level"을 포함한 영국의 학업 자격이 포함됩니다.Lucene.Net - 공간 구분 문구를 단일 토큰으로 처리하는 방법?

사용자가 "A 레벨"이라는 문구를 사용하여 검색 할 수있게하고 싶지만 표준 분석기를 사용하면 "A"가 중지 단어로 표시되지 않으므로 "레벨"만 색인/검색됩니다. .

이 문제를 해결하기위한 최선의 방법은 무엇입니까? 나는 어떻게 든 사용자 정의 분석기를 작성하여 "A 레벨"또는 "A 레벨"로 토큰 화해야한다고 생각합니다.

이 방법이 최선의 방법입니까?

편집 :

주 내가 원하는 전체 검색 문구 쿼리되고 싶지 않아. 즉 검색 창에서 사용자가 < "A Level"AND English Maths Physics>를 입력 할 수있게하려면 "A Level"과 영어 수학 또는 물리학 중 하나를 반환해야합니다. 이를 반영하여 질문이 업데이트되었습니다.

내가 특별히 'A 등급'

문구 'A 등급'에서 아파트 모든 경우에 정지 단어로 'A'의 사용을 계속하고 싶습니다 그것에서, 그것은 자신의 특정 필드에없는 구문을 포함 할 수있는 자유 텍스트 필드입니다.

답변

3

사용 PhraseQuery - 부울 건설에 의해 다른과 결합 될 수

편집을 할

당신은 전체 문구를 검색 할 필요가 없습니다. 당신이 어떤 분석기를 사용했다 - 당신이 다음과 같이 보이는 샘플에 대한

BooleanQuery rootQuery = new ... 
PhraseQuery q1 = new PhraseQuery("A Level"); 
TermQuery q2 = new TermQuery("English"); 
TermQuery q3 = new TermQuery("Maths"); 
TermQuery q4 = new TermQuery("Physics"); 
rootQuery.Add(q1, BooleanClause.Occur.SHOULD); //or MUST - depends on you 
rootQuery.Add(q2, BooleanClause.Occur.SHOULD); 
rootQuery.Add(q3, BooleanClause.Occur.SHOULD); 
rootQuery.Add(q4, BooleanClause.Occur.SHOULD); 
+0

하지만 전체 검색 문구 쿼리 싶지 않아합니다. 즉, 사용자가 < "A Level"AND English Maths Physics>를 입력 할 수있게하려면 검색 상자에 "A Level"과 영어 수학 또는 물리학 중 하나를 반환해야합니다. 이를 반영하여 질문이 업데이트되었습니다. –

+0

@Gareth D - 편집 내역 – Dewfy

+2

@Dewfy - 문제는 아직 해결되지 않습니까? 즉 'A 레벨'의 'A'는 표준 분석기에 의해 중지 단어로 제거되어 구문 쿼리가 'A 레벨'이 아닌 '레벨'의 모든 인스턴스를 반환하게됩니다. –

1
당신이 내용을 인덱싱 않았다 어떻게

(나는 지금 그것을 테스트 할 수 없기 때문에 죄송는 의사 코드이다)?

Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29, new Hashtable()); 

그래서 인덱스 상단 분석기와 contenxt : 당신이 다음 생성자에서 중지 단어를 지정할 수 있습니다 StandardAnalyzer를 사용하는 경우 (비어있는 목록을 사용할 수 있습니다). 그 후 당신이 QueryParser를 사용하여 콘텐츠를 조회 할 수 있습니다 (위의 분석기를 사용하십시오) 또는 수동 구조 쿼리 할 수 ​​있습니다

 // Phrase query 
     PhraseQuery phraseQuery = new PhraseQuery(); 
     phraseQuery.Add(new Term("MyField", "A")); 
     phraseQuery.Add(new Term("MyField", "Level")); 

     // Or query 
     BooleanQuery orQuery = new BooleanQuery(); 
     orQuery.Add(new BooleanClause(new TermQuery(new Term("MyField", "English")), BooleanClause.Occur.SHOULD)); 
     orQuery.Add(new BooleanClause(new TermQuery(new Term("MyField", "Maths")), BooleanClause.Occur.SHOULD)); 
     orQuery.Add(new BooleanClause(new TermQuery(new Term("MyField", "Physics")), BooleanClause.Occur.SHOULD)); 

     // Main query 
     BooleanQuery query = new BooleanQuery(); 
     query.Add(phraseQuery, BooleanClause.Occur.MUST); 
     query.Add(orQuery, BooleanClause.Occur.MUST); 

안녕은

+0

StandardAnalyzer를 사용하고 있습니다. 나는 'A Level'에서 appart 한 모든 경우에 'A'를 중지 단어로 사용하고 싶기 때문에 문제가 해결되지 않았 음을 사과드립니다. 이것을 명확히하기 위해 질문을 업데이트 할 것입니다. –

+0

왜 안 되니? 그런 다음 두 개의 분석기 (하나는 'A'를 중지 단어로 사용하고 하나는 'A'가 중지 단어가 아님)를 작성하고 비즈니스 요구 사항에 따라 분석기를 선택하십시오 (색인 및 검색 중). PerFieldAnalyzerWrapper를 사용하여 필드 당 분석기를 설정할 수도 있습니다. 또는 결국, 다른 분석기를 선택하십시오. – rrejc

+0

나는 그가 현장에 기반하지 않고 현장 용어를 기반으로 정지 단어를 전환하고 싶어한다고 생각합니다. 그래서'PerFieldAnalyzerWrapper'는 작동하지 않습니다. – Xodarap

1

KeywordAnalyzer는 StandardAnalyzer 달리, 문자열을 토큰 화하지 않습니다. 나는 이것의 .net 구현이 있다고 가정한다. - possibly this?.

나는 종종 이런 일을 (자바는 다음, 조심) 할 것이다 : 나는 "구"또는하지의 텍스트를 치료하기 위해 거세한 숫양을 결정하는 필드 이름을 사용함으로써

private ReusableAnalyzer getReusableAnalyzer(String fieldName, Reader reader) { 
    boolean phrase = treatAsPhrase(fieldName); 
    ReusableAnalyzer ra = new ReusableAnalyzer(); 
    TokenStream result = phrase ? new KeywordTokenizer(reader) : new StandardTokenizer(version, reader); 

.

+0

다른 텍스트도 포함되어 있으므로 필드를 토큰 화하려고합니다. 'A 레벨'이라는 문구는 자신의 특정 분야가 아니며 자유 문안에있어 문구를 숨길 수 있습니다. 이 문제를 명확히하기 위해 질문을 업데이트했습니다. –

+0

StopFilter의 사용자 지정 구현을 만들 수 있습니다 - 원본을 복사하십시오. 이 경우, 정지 단어 'A'와 일치하고 다음 토큰까지 'look-ahead'가 일치하면 'Level'인 경우 중지를 적용하지 마십시오. – Joel

2

저는 현재 Lucene과 함께 할 수 없다고 생각합니다. 나는 반 가공 플러그를 가지고 있는데, 이걸하면 here을 볼 수 있습니다. 위치 및 오프셋 속성을 설정하지 않습니다. 즉, 구문 검색이 올바르게 작동하지는 않지만 잘하면 시작에 도움이 될 것입니다.

+0

이것은 내가 염두에 두었던 것과 매우 흡사합니다. 나는 그것과 함께 플레이하고 위치와 오프셋 속성을 얻으려고 노력할 것이다. –

+0

@Gareth D : 코드를 게시하면 코드를 게시하여 훔칠 수 있습니다. :-) – Xodarap

+0

왜 사용자 정의 StopFilter를 만들지 않으십니까? – Joel

1

Lucene에서는 좀 더 맞춤 설정이 가능합니다.

1) 정지 단어가 보존되는 별도의 필드를 만듭니다. StandardAnalyzer에서 상속받은 자체 분석기를 만들어야하지만 기본 생성자에 중지 단어가 지정되어 있지 않습니다.

public class PreserveStopWordsAnalyzer : StandardAnalyzer 
{ 
    public PreserveStopWordsAnalyzer() : base(Version.LUCENE_29, new Hashtable()) 
    {} 
} 

2) 검색은 '중지 단어'필드에 대한 용어를 인용했다. 예를 들어 :

+RegularField:English +StopWordField:"A Level"

관련 문제