2017-04-20 18 views
0

봄 SOLR 데이터에 전체 용어를 얻을이 링크 참조 : 예를 들어, 테이블 도시 : 내 표에서 https://github.com/christophstrobl/spring-data-solr-showcase가 어떻게 봄의 데이터 SOLR를 사용하고

을, 나는 행의 임기를 얻고 싶은

id: 1 
name: San Francisco 

인터페이스 :

interface ProductRepository extends SolrCrudRepository<Product, String> { 

@Highlight(prefix = "<b>", postfix = "</b>") 
@Query(fields = { SearchableProductDefinition.ID_FIELD_NAME, 
        SearchableProductDefinition.NAME_FIELD_NAME, 
        SearchableProductDefinition.AVAILABLE_FIELD_NAME }, defaultOperator = Operator.AND) 
HighlightPage<Product> findByNameIn(Collection<String> names, Pageable page); 

@Facet(fields = { SearchableProductDefinition.NAME_FIELD_NAME}) 
FacetPage<Product> findByNameStartsWith(Collection<String> nameFragments, Pageable pagebale); 
} 

방법은 서비스에서 용어를 얻을 :

public FacetPage<Product> autocompleteNameFragment(String fragment, Pageable pageable) { 
    if (StringUtils.isBlank(fragment)) { 
     return new SolrResultPage<Product>(Collections.<Product> emptyList()); 
    } 
    return productRepository.findByNameStartsWith(splitSearchTermAndRemoveIgnoredCharacters(fragment), pageable); 
} 

private Collection<String> splitSearchTermAndRemoveIgnoredCharacters(String searchTerm) { 
    String[] searchTerms = StringUtils.split(searchTerm, " "); 
    List<String> result = new ArrayList<String>(searchTerms.length); 
    for (String term : searchTerms) { 
     if (StringUtils.isNotEmpty(term)) { 
      result.add(IGNORED_CHARS_PATTERN.matcher(term).replaceAll(" ")); 
     } 
    } 
    return result; 
} 

난 그냥 도시 테이블에 결과를 받았다 검색 인 경우 :

'San' 

그러나 예상 된 결과는 다음과 같습니다

'San Francisco' 

의 schema.xml :( 업데이트)

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> <!-- StandardTokenizerFactory--> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
    <!-- in this example, we will only use synonyms at query time 
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> 
    --> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> <!-- StandardTokenizerFactory--> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

나는 tokenizer를 대체했습니다 : StandardTokenizerFactory by KeywordTokenizerFactory a nd 얻을 수있는 값 : '샌프란 시스코'자동 완성에 있지만

이 경우 전체 기간을 얻는 방법? 너무 감사합니다 !

답변

0

이는 아마도 Spring Data Solr 때문이 아니라 Solr 스키마 때문일 것입니다.

이름 필드는 '샌프란시스코'에서 두 용어를 얻을 것이다합니다 (Standardanalyzer 또는 WhitespaceAnalyzer 같이) 토큰 화 분석기로 분석하는 경우 :

  1. 시스코 이것이 원하지 않는다면, KeywordTokenizer 또는 schema.xml의 'solr.StrField'클래스 필드와 같이 토큰 화되지 않는 유형 (또는 분석기)을 사용해야합니다.

+0

안녕하세요 @ Persimmonium : 답장을 보내 주셔서 감사합니다. 위와 같이 schema.xml을 업데이트했고 값을 반환했습니다. –