2017-04-20 2 views
0

ich Frühling Daten solr verwenden und diesen Link verweisen: https://github.com/christophstrobl/spring-data-solr-showcaseWie volle Amtszeit im Frühjahr Solr Daten bekommen

In meinem Tisch, ich will volle Amtszeit von Reihe bekommen: Beispiel, Tisch Stadt:

id: 1 
name: San Francisco 

Schnittstelle:

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); 
} 

Methode Begriff in Service erhalten:

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; 
} 

Wenn die Suche ich nur ein Ergebnis in der Stadt Tabelle erhalten ist:

'San' 

Aber erwartete Ergebnis ist:

'San Francisco' 

Schema.xml :(aktualisiert)

<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> 

Ich habe Tokenizer ersetzt: StandardTokenizerFactory von KeywordTokenizerFactory a nd ich kann Wert erhalten: 'San Francisco' in Autocomplete aber Null zurückgeben

Wie in diesem Fall volle Laufzeit? Vielen Dank !

Antwort

0

Dies liegt wahrscheinlich nicht an Spring Data Solr, sondern an Ihrem Solr-Schema.

Wenn der Name Feld mit einem Tokenisieren Analysator (wie die Standardanalyzer oder WhitespaceAnalyzer) analysiert Sie zwei Begriffe von 'San Francisco' erhalten wird:

  1. San
  2. Francisco

Wenn dies nicht gewünscht ist, müssen Sie einen Typ (oder Analysator) verwenden, der nicht in Token umgewandelt wird, wie das KeywordTokenizer oder ein Klassenfeld "solr.StrField" in schema.xml

+0

Hallo @Persimmonium: danke für deine Antwort, ich habe schema.xml wie oben aktualisiert und es gibt null zurück –

Verwandte Themen