2017-04-20 6 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. サン
  2. サンフランシスコそれがあなたの望むものでない場合は、KeywordTokenizerやschema.xmlの 'solr.StrField'クラスフィールドのようにトークン化しないタイプ(またはアナライザ)を使用する必要があります

+0

こんにちは@Persimmonium:返信いただきありがとうございます、上記のようにschema.xmlを更新しました。 –

関連する問題