2016-05-11 8 views
0

Gibt es eine Möglichkeit, das analyzer programmatisch zur Indizierung eines bestimmten Feldes durch die Elasticsearch-Serverinstanz über einen Client zu erhalten (vorausgesetzt, der Analyzer ist auf beiden Seiten verfügbar) , Na sicher)?Elasticsearch: Analysator zur Indizierung eines bestimmten Feldes von der Clientseite

Zum Beispiel mit einer Abbildung wie:

{ 
    "mappings": { 
     "article": { 
      "properties": { 
       "text": { 
        "type": "string", 
        "index": "analyzed", 
        "analyzer": "spanish" 
       } 
      } 
     } 
    } 
} 

wie wäre es möglich, org.apache.lucene.analysis.es.SpanishAnalyzer für das Feld zu bekommen text mit the Java client for Elasticsearch, wie unten gezeigt?

import java.net.InetAddress; 
import java.net.UnknownHostException; 
import java.util.Collections; 

import org.elasticsearch.action.search.SearchRequestBuilder; 
import org.elasticsearch.action.search.SearchResponse; 
import org.elasticsearch.client.Client; 
import org.elasticsearch.client.transport.TransportClient; 
import org.elasticsearch.common.transport.InetSocketTransportAddress; 
import org.elasticsearch.index.query.QueryBuilder; 
import org.elasticsearch.index.query.QueryBuilders; 
import org.elasticsearch.search.SearchHit; 

public class QueryAnalyzerTest { 

    public static void main(final String[] args) throws UnknownHostException { 
     final String docTextFieldName = "text"; 
     Iterable<SearchHit> hits = Collections.emptyList(); 

     try (final Client client = TransportClient.builder().build() 
       .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300))) { 
      final QueryBuilder queryBuilder = QueryBuilders.matchQuery(docTextFieldName, "anuncio"); 
      final SearchRequestBuilder searchRequestBuilder = client.prepareSearch("news").setQuery(queryBuilder) 
        .setTypes("article"); 
      final SearchResponse response = searchRequestBuilder.get(); 
      hits = response.getHits(); 
     } 

     hits.forEach(hit -> { 
      final String docText = (String) hit.getSource().get(docTextFieldName); 
      // TODO: Tokenize "docText" with the exact same tokenizer used when 
      // indexing the field 
     }); 

    } 

} 

Antwort

3

Sie können auf jeden Fall die Abbildung des text Feld erhalten programmatisch client().admin().indices().prepareGetFieldMappings("indexName") verwenden, und Sie in der Lage sein, den logischen Namen des Analysators (dh „spanisch“) abgerufen werden, aber Sie werden nicht das bekommen Klassenname des Analysators.

Dafür müssen Sie AnalysisRegistry.getAnalyzer("spanish") aufrufen, und Sie erhalten die richtige Analyzer-Instanz.

+0

Der erste Teil war Spot-on, aber leider habe ich keine 'AnalysisRegistry'-Klasse (Ich betreibe Elasticsearch 2.3.2); Hat sich die API geändert? – errantlinguist

+0

Nein, aber wahrscheinlich, dass 'AnalysisRegistry' nicht in der Client-JAR enthalten ist, würde mich nicht überraschen. – Val

+0

Haben Sie Glück dabei? Brauchen Sie weitere Informationen? – Val

Verwandte Themen