2012-01-02 1 views
0

구문 검색의 경우 정확히 일치하는 경우 (즉, 불용어 무시 제외)에만 결과를 표시하려고합니다. 문구가 아닌 검색 인 경우 단어의 루트 형태와 일치하는 경우에도 결과를 표시 할 수 있습니다.필드 수를 늘리지 않고 lucene을 사용한 정확한 구문 검색

Google은 현재 standardTokenizer, StopFilter, PorterStemFilter 및 LowerCaseFilter를 통해 데이터를 전달합니다. 이 때문에 사용자가 "암호 관리"를 검색하려고 할 때 "password manager"가 포함 된 결과가 검색됩니다.

StemFilter를 제거하면 구문 검색을하지 않는 단어의 루트 형식과 일치시킬 수 없습니다. 문서의 두 필드 중 일부와 동일한 데이터를 색인화해야한다고 생각했습니다.

나는 동일한 질문을 Different indexing and search strategies on same field without doubling index size?에 요청했습니다. 그러나 사무실에있는 사람들은 두 필드의 일부로 동일한 데이터를 색인화하는 것에 만족하지 않습니다. (우리는 현재 lucene 문서에 약 20 개의 텍스트 필드가 있음). TokenFilters를 사용하여 위에 나열된 두 가지 경우를 모두 지원할 수있는 방법이 있습니까?

StopFilter에 대해 입력 토큰과? (무시 된 단어의 경우)와 동일한 위치 증가분을 갖습니다. 마찬가지로 StemFilter의 경우 동일한 위치 증가분을 가진 입력 토큰과 막대 그래프 토큰을 모두 방출합니다. 기본적으로 입력 및 출력 토큰 (무시 된 토큰)은 같은 위치에 있습니다.

이 방법을 사용하는 것이 안전할까요? 다른 사람이 여기에 나열된 요구 사항에 직면 했습니까? 내 접근법에서 언급 한 것과 비슷한 것을 수행하는 필터를 즉시 사용할 수 있습니까?

감사합니다.

답변

1

"입력 및 출력 토큰"이 무슨 뜻인지 이해할 수 없습니다. 한 번 줄기와 한 번 줄기가없는 데이터를 두 번 저장 하시겠습니까?

두 번 저장하지 않으면 나는 당신의 방법이 효과가 있다고 생각하지 않습니다. 저장된 단어가 jumping이고 jumped을 검색한다고 가정합니다. 쿼리 구문 분석기는 jumpjumped을 표시 할 수 있지만 값이 jump으로 저장되어 있지 않으면 쿼리 일치기는 jumping과 계속 일치하지 않습니다.

값을 줄기로 한 번 저장하면 한 번 non-stemmed로, 그럼 왜 그냥 두 필드에 저장하지 않을거야? 그렇다면 이상한 토크 나이저 변경 사항을 처리 할 필요가 없습니다.

+0

@Xodarp : 예, 두 필드를 사용하지 않고 두 번 저장할 계획입니다 (앱 쿼리 언어를 Lucene 쿼리로 변환하는 동안 일을 단순화하기 위해). 이것이 검색 엔진의 구현 방법에 대해 알고 있습니까? 감사합니다. – naresh

+0

대부분의 검색 엔진은 스토리지가 저렴하고 대기 시간이 길다는 의견을 가지고 있으므로 중복 저장하는 경로를 따르는 경향이 있습니다. Google이 여러 필드 (또는 "필드"아이디어)를 보유하고 있는지 여부는 말할 수 없습니다. – Xodarap

+1

다음과 같이 추가해야합니다 :이 토큰 라이저를 변경하면 강조 표시와 관련된 모든 문제가 발생합니다. 번역을 수행하는 것보다 Lucene의 코드를 망가 뜨리는 것이 더 쉬운 지에 대해주의 깊게 생각하십시오. – Xodarap

관련 문제