2014-11-12 5 views
2

Lucene.net 2.9를 사용하고 있으며 내 쿼리가 예상 결과를 반환하지 않는 이유를 이해하려고합니다.Lucene.Net "-"또는 와일드 카드를 사용할 때 예상 검색 결과를 반환하지 않음

다음 함수를 사용하여 인덱싱 된 문서에 필드를 추가합니다. 문서에 필드를 추가 할 때 내가 Lucene.Net.Documents.Field.Index.NOT_ANALYZED을 사용하고 있기 때문에 내가 이해하는 바로는

//add fields to the document 
public void AddFacet(Lucene.Net.Documents.Document doc, String facetName, String facetValue) 
{ 
    doc.Add(new Lucene.Net.Documents.Field(facetName, facetValue, Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.NOT_ANALYZED)); 
} 

//snippet of analyzer being used 
Lucene.Net.Analysis.Analyzer analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29); 

//snippet of a simple demo 
Lucene.Net.Documents.Document doc = new Lucene.Net.Documents.Document(); 
AddFacet(doc, "FACET", "INDEX-VALUE-TEST"); 

facetValue 용어로 토큰 화되지 않습니다.

원래 facetValue이 "INDEX-VALUE-TEST"로 저장되었다고 생각합니다. 토큰화될 경우 분석기가 -을 중지 단어로 해석하기 때문에 "INDEX", "VALUE"및 "TEST"의 여러 용어로 저장됩니다.

"INDEX"에 대한 검색을 수행하면 검색어가 +(xml:index) 인 것처럼 보입니다. 검색어는 해당 용어에 "INDEX"가 포함 된 모든 문서를 반환합니다. 이것은 예상된다.

나는 다음과 같은 경우를 이해하지 않는다 : 나는 "INDEX-VAL"에 대한 검색을 수행 할 경우

  1. , 내 쿼리 결과가 반환 +(xml:index-val)처럼 보일 것이다. 와일드 카드가 없기 때문에 결과가 반환되지 않는 이유를 알 수 있습니다.

  2. "INDE *"에 대한 검색을 수행하면 내 쿼리는 +(xml:inde*)처럼 표시되며 다시 결과가 반환되지 않습니다. 왜 이것이 문서를 반환하지 않는 지 모르겠습니다. 나는 그들의 분야에서 "INDE"를 포함하는 모든 문서를 되 찾을 것을 기대합니다.

  3. "INDEX-VALUE-TEST"를 검색하면 검색어는 +(xml:index-value-test)입니다. 다시 말하지만 결과는 없습니다. 나는 1 개의 문서를 되 찾을 것으로 기대한다.

"INDEX-VALUE-TEST"라는 용어를 저장 한 경우 결과 # 2 및 # 3이 반환되지 않는 이유는 무엇입니까? 왜 나머지 단어와 일치시키기 위해 # 1은 와일드 카드가 필요할 수 있기 때문에 # 1이 아닌지 알 수 있습니다. 그렇다면 왜 와일드 카드가없는 "INDEX"를 검색하고 모든 문서를 얻을 수 있습니까? 나는 누군가가 나를 내가 부족 무엇을 이해하는 데 도움 수 있다면 내가 this source to understand the fields I'm adding to the document.

을 사용하고

this source to understand the indexing files.을 사용하고

, 그것은 크게 감상 할 수있다.

답변

2

내가 생각하기에, 그게 오른쪽 해결 방법은 우리 자신의 파서/분석기 그래서 우리가 무슨 일이 있었는지 더 제어 할 수 있도록 작성하는 것입니다. 노력의 수준은 현재 (아마도 다른 문제가 나타날 때까지) 정당화 될 수 없습니다.

내 작업은 검색 할 때 모두 -을 공백으로 바꾸는 것이 었습니다. 검색 결과를 내가 기대했던 것과 더 일치하게 만들었습니다. 분석기는 일반적으로 와일드 카드가 아닌 쿼리에 대해이 문자를 일관된 방식으로 토큰화할 것이기 때문에 괜찮을 것입니다.

0

Lucene.Net.Documents.Field.Index.NOT_ANALYZED를 사용하여 필드의 색인을 생성하면 이해할 때 대/소문자를 구분합니다.검색 문자열을 대문자로 변경하면 사례 # 2 및 # 3에서 결과가 반환 될 수 있습니다. 검색 할 때 사용하는 분석기가 모든 것을 소문자로 변환하면 필드를 소문자 문자열로 색인화해야 할 수도 있습니다.

사례 # 3의 경우 검색 쿼리에서 '-'대시 문자를 이스케이프해야하므로 검색이 + (xml : INDEX \ -VALUE \ -TEST)가됩니다. '-'문자를 사용하는 검색은 부울 연산자로 해석 될 수 있습니다.

+0

OP는 공백으로 시작하는 하이픈을 부울 연산자로 처리하는 StandardAnalyzer를 사용합니다. 여기서는 그렇지 않습니다. 내 대답을 보라. – groverboy

+0

예. 죄송합니다. 공백은 부울 연산에 필요합니다. 대소 문자가 여전히 문제가됩니다. –

0

당신이 쓴 :

분석기는 해석 - 정지 단어로.

StandardAnalyzer 하이픈 해석 StandardTokenizer, 사용하여 텍스트를 토큰 화 -을하지 않는 stop word로, punctuation로를(). 실제적으로 결과는 동일합니다. 하이픈을 삭제합니다.

StandardTokenizer이 토큰에 쿼리 식 "INDEX-VALUE-TEST"를 토큰 화합니다

(INDEX, VALUE, TEST) 

색인에서 단일 토큰에 일치하지 않을 수 :

(INDEX-VALUE-TEST) 

Lucene이 UAX 29에서 유니 코드 세그멘테이션 규칙을 적용 할 때 하이픈 처리는 미래에 변경 될 것으로 예상됩니다. 그러나 여기에서 문제는 구두점이 아닙니다. "INDEX -VALUE-TEST "는 구두점 문자가 아닙니다.

+ (XML : 인덱스 값 테스트)

이 필드 "XML"에 대한 검색처럼

어쨌든 그것은 쿼리 파서 수율 때문에이 쿼리 대신 "FACET"의 모습

"xml"이 색인의 기본 검색 필드라고 말하고 싶습니다.

WhitespaceAnalyzer를 사용하여 원하는 동작을 얻을 수 있지만 KeywordAnalyzer를 사용하는 것이 좋습니다 (전체 필드를 단일 토큰으로 처리).

색인 생성 및 검색에는 동일한 분석기를 사용해야합니다. 쿼리 분석기를 사용했을 때, 관련 필드를 지정 : 당신이 패싯 KeywordAnalyzer뿐만 아니라 다른 분야에 대한 StandardAnalyzer 필요한 경우

FACET:INDEX-VALUE-TEST 

, 당신은 PerFieldAnalyzerWrapper를 사용할 수 있습니다.