4

Zend Lucene을 사용하여 PHP 웹 사이트에 대한 검색 기능을 만들고 있는데 문제가 있습니다. 내 웹 사이트는 Shop Director입니다 (그와 비슷한 것).Zend Lucene에서 "Foo Bar"를 검색 할 때 "Foo Bar"를 찾는 방법

예를 들어 나는 "FooBar"라는 상점을 운영하지만 내 방문자는 "Foo Bar"를 검색하여 제로 결과를 얻습니다. 또한 상점 이름이 "Foo Bar"이고 방문객이 "FooBar"를 검색하면 아무 것도 발견되지 않습니다.

내가 "는 foobar ~"(퍼지 seach)에 대한 seach 시도했지만

가 인덱스를 작성하거나 쿼리를 만들기 위해 speciar 방법이 있나요 "푸 바"라는 기사를 발견하지 않았다?

답변

2

옵션 1 : 여러 부분에서 입력 쿼리 문자열을 두 부분으로 나누어 검색하십시오. 예. 이 경우 쿼리는 (+ fo + bar) OR (+ foo + bar) 또는 (+ foob + ar)입니다.이 토큰 화는 입력 쿼리 문자열에 두 개의 토큰이 있다고 가정합니다. 또한 (+ foob + ar)의 결과와 같은 추가 결과, 아마도 관련성이없는 결과를 얻을 수도 있습니다.

옵션 2 : 색인 생성 및 쿼리 중에 n-gram 토큰 화를 사용하십시오. "foo bar"에 대한 토큰을 인덱싱하는 것은 fo, oo, ba, ar 일 것입니다. foobar로 검색하는 동안 토큰은 fo, oo, ob, ba, ar이됩니다. OR 연산자를 연산자로 사용하면 상단에 최대 n-gram 일치 항목이있는 문서가 제공됩니다. 당신이 성능에 대해 신경 WildcardQuery를 사용하지 않는 경우이 캔 (성능이 크게 악화) NGramTokenizer

+0

Op. 2 좋은 소리, n 그램 토큰 화를 사용하는 방법을 어떤 생각을 가지고 있습니까? 덕분에 – Daniel

0

"* foo * AND * bar *"또는 "* foo * OR * bar *"를 시도 했습니까? 그것은 흰 족제비에서 작동하며 Lucene에 기초를두고 있습니다.

+0

queri가 FOO BAR 인 경우 데이터베이스에 FOOBAR가 있지만 FOOBAR에 대해 검색 중이며 DB에 FOO BAR이있는 경우 작동하지 않습니다 – Daniel

+0

맞아요, 제 실수 ... 미쳤어 요. 아이디어 : 모든 문자 "f * o * o * b * a * r"사이에 '*'를 넣고 문자열 길이 제한 (str_len> 5 일 경우)을 설정하십시오. 아니면 대문자와 소문자 사이에 공백을 넣으려고 할 수 있습니다. 그런 다음 "Foo Bar"를 "Foo Bar"로 분리해야하지만, 사용자는이 문자열을 낙타의 경우에 넣어야합니다. – klew

0

달성 :

new WildcardQuery(new Term("propertyName", "Foo?Bar")); 

0 개 이상의 문자 사용의 경우 '*', 0 또는 1 문자 , '?'를 사용하십시오.

성능이 중요한 경우 부울 쿼리를 사용해보십시오.

+0

사용자가 "foobar"를 검색하고 데이터베이스에 "foo bar"가 있으면 스크립트가 그 위치를 알 수있는 방법이 없습니다. "?" 또는 "*" – Daniel

1

가장 일반적인 이름 혼동을 위해 색인 항목을 수동으로 추가하십시오. 고객에게 특별 양식을 입력하십시오.

관련 문제