2013-02-13 1 views
3

여러 필드에서 자동 완성을 수행했지만 다중 값 필드에서 자동 완성을 수행하지는 않았지만 게시물을 보았습니다.다중 값 필드에서 Solr4를 사용하는 자동 완성 기능

내 복수 기능이없는 입력란에 내 자동 완성 기능이 작동합니다.

제 문제는 문서가 해당 쿼리와 일치 할 때마다 복수 값 필드에서 쿼리를 실행하면 모두 해당 문서의 다중 값 필드에있는 필드가 패싯 결과에 반환됩니다.

다음은 Solr 4 Cookbook에서 제안 된 것과 유사한 내 스키마입니다.

<fieldType name="text_autocomplete" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" /> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

<field name="publisherText-str" type="string" indexed="true" stored="false" multiValued="true"/> 
<field name="publisherText-ac" type="text_autocomplete" indexed="true" stored="true" required="false" multiValued="true"/> 

자세히 알 수 있듯이 publisherText는 다중 값 필드입니다.

/select?q=publisherText-ac:new&facet=true&facet.field=publisherText-str&facet.mincount=1&rows=0 

쿼리는 "새로운"이며,이 문서의 세트를 일치 :이 같은 쿼리가 자동 완성 기능을 테스트하기 위해 실행합니다. 그러나 패싯 결과 집합에는 일치하는 각 문서에 대한 다른 publisherText 값 (다중 값 필드에 포함됨)이 포함됩니다.

업데이트 : "new"를 쿼리 할 때 "New York Times"와 "Times New Roman"이 포함되어야하지만 삽입물 문제를 해결할 필요는 없습니다. "Knewton Gazette"이 필요하지 않습니다. 결과 세트.

패싯 결과에 쿼리와 일치하는 값만 포함되도록 할 방법이 있습니까? 또는 multiValued 필드를보다 정상적으로 처리하는 완전 자동 완성 기능을 지원하는 다른 (더 좋은?) 방법이 있습니까?

감사합니다.

답변

3

나는 최적의 방법은 별도의 컬렉션 또는 코어 (클라우드를 사용하는지 여부에 따라 다름)를 만들고 데이터를 원하는 방식으로 인덱싱하여 원하는 쿼리 결과를 쿼리 할 수 ​​있다고 생각합니다. 물론 어떤 경우에는 가능하지 않을 수도 있지만, 귀하의 경우에 해당되면 가능합니다. 이러한 핵심에서는 자동 완성과 관련된 필드와 데이터 만 있으므로 대부분의 경우 원본 코어보다 작고 용어가 적어 쿼리 속도가 빨라집니다. 그 외에도 자동 완성 쿼리에 최적화 된 이러한 코어 또는 컬렉션을 사용하면 더 많은 성능을 얻을 수 있습니다.

그러나 필터링이 필요한 경우 강조 표시보다 여러 코어/모음으로 접근 할 수없는 경우 이동하는 것이 가장 좋은 방법 일 수 있습니다. 이 경우에는 Term verctor를 켜고 FastVectorHighlighting을 사용하여 Solr 강조 표시 (http://solr.pl/en/2011/06/13/solr-3-1-fastvectorhighlighting/)의 성능을 향상시킬 수 있습니다.

+0

"원하는 방식으로 데이터를 인덱싱하여 원하는 쿼리 결과를 쿼리 할 수 ​​있습니다."-이 질문에 대한 내용이 아닙니까? 이 문제에 대해서는 좀 더 자세한 설명이 필요합니다. 여기서 어떻게 핵심적인 도움이 될 수 있습니까? 자동 완성 결과가 중복을 반환하지 않도록 데이터를 표준화하라는 의미입니까? 또한 질문은 성능에 관한 것이 아니라 "multiValued 필드를보다 정상적으로 처리하는 자동 완성 기능"에 관한 것입니다. 자동 완성을위한 별도의 코어를 유지하는 것이 그만한 가치가 있음을 보여줘야하며 실제로는 사인이 될 수 있습니다. 이미이 솔루션보다 성능이 좋습니다. – Risadinha

1

지금까지,이 두 가지 방법을 사용하고 있습니다 :

(A)의면을 사용하여에 충실하고 정규 표현식 또는 String.startsWith를 통해 결과를 줄여야 할 것을 동의합니다. YUI3 Autocomplete 플러그인과 같은 프론트 엔드 구성 요소를 사용하면이 기능을 제공하지 않아도 실제로 그렇게 나쁘지는 않습니다.

(B)는 쿼리에 추가하여 강조 표시 사용

각각의 히트를 들어
&hl=true&hl.fl=publisherText-ac 

이 강조 구성 요소 (기본 <em>으로) 태그를 강조 포함하여 일치하는 값을 반환합니다. 이것은 자동 완성 필드가 여러 입력 필드에 의해 제공되고 결과를 검색하여 일치하는 값을 포함하는 필드를 찾으려는 경우에 더 유용합니다. 그러나 결과 목록에 중복이 포함될 수 있습니다.

나는 (A) 단일 필드에 자동 완성을 위해 (B) 여러 필드에서 자동 완성을 소싱 할 때 두 가지 방법을 사용하고 있습니다. 강조 표시된 결과에 포함 된 <em> 태그를 없애려고했으나이를 변경할 수는 있지만 완전히 제거 할 수는 없습니다. (여기에 SOLR 4.0을 사용)

+0

내 답변을 살펴 보니 재미 있을지도 모릅니다. 건배 – javanna

1

당신은 단지 facet.prefix=new 매개 변수를 사용하고 SOLR 필터를 당신을 위해 밖으로 해당 항목을하도록 할 수 있습니다. 내가 고려해야 할 것은 여기서 ngram을 작성하지 않는 것입니다. 패싯을 만들고 facet.prefix을 사용하면 이미 트릭을 수행합니다.다행히도 고유 한 용어가 너무 많지 않으므로 성능이 좋을 것입니다.

+0

응답 해 주셔서 감사합니다. facet.prefix는 도움을 주지만 문제를 완전히 해결하지는 못합니다. 결과 집합에는 단어가 일치하는 값이 포함되어야합니다. 예를 들어 내 쿼리가 "new"인 경우 결과 집합에 "New York Times"와 "Times New Roman"이 포함되어야합니다 (그러나 중침을 지원할 필요는 없으며 "Knewton Gazette"은 결과 집합에있을 필요는 없습니다) . –

+0

그래, 그게 새로운 문제 야. 다음으로 유사하지만 다른 방식으로 동작하는 용어 구성 요소를 살펴보고 표시된 접미어 대신 정규식을 지정하여 표시된 결과를 필터링 할 수 있습니다. 스키마를 변경해야 할 수도 있으며, 해당 필드에 대한 고유 용어의 수에 따라 성능이 저하 될 수 있습니다. – javanna

+0

감사. TermsComponent를 살펴 보겠습니다. 내가 필터링 할 수 있기를 원했기 때문에 몇 가지 한계가있는 것처럼 보입니다. 이 비정형 화 된 방식으로이 게시자 필드를 인덱싱하는 별도의 코어를 설정하려고합니다. 각 문서는 게시자입니다. 이 색인은 데이터를 다중 값 필드에 묻는 대신이 데이터에 대한 자동 완성 요청을 처리하는 데 사용됩니다. –