2015-11-02 2 views
0

Я «почти» новичок в Elastic Search. Я использовал его некоторое время, но раньше не использовал Анализаторы.Должен ли я отображать все мои индексы с помощью моего анализатора на ElasticSearch?

Я могу сделать полнотекстовый поиск по моему проекту, но проблема в том, что когда я пытаюсь найти такое имя, как «Alex», я должен полностью набрать имя в корне. Он не работает с «Al» или «Ale». В нем говорится что-то вроде «no match found».

Я нашел некоторые исходные коды с разных сайтов, но это меня смущает.

Что я должен сделать, это:

1) Создание Ngram токенизатор

2) Тогда отображение с моими всеми индексами?

У меня есть много индексов, которые уже созданы, и я получил ошибки при создании сопоставления с ними.

Должен ли я создавать настройки и отображение анализатора в начале, непосредственно перед индексацией моих записей?

Я работаю над проектом Java, поэтому ответы на JAVA API будут очень оценены.

Большое спасибо!

ответ

0

Сначала должны быть созданы сопоставления, а затем данные должны быть проиндексированы. если возможно, удалите старые индексы и воссоздайте их с новым сопоставлением. если вас беспокоит потеря данных, просто создайте новый тип для существующего индекса. новый тип может использовать новое сопоставление.

, например, здесь кусок, который использует API Java для создания пользовательских отображений

public class MappingCreator { 

    static Logger log = Logger.getLogger(MappingCreator.class.getName()); 

    final static String indexName = "indexName"; 

    final static String typeName = "typeName"; 

    final static String mappingFileName = "pathToMapping.jsonFile"; 

    final static String clusterName = "elasticsearch"; // or name of your cluster 

    final static String hostName = "localhost"; 

    public static void main(String args[]) throws IOException 
    { 

     MappingCreator mapCreator = new MappingCreator(); 

     Client myESclient = getClient(); 

     IndicesExistsResponse res = myESclient.admin().indices().prepareExists(indexName).execute().actionGet(); 

     if (res.isExists()) { 

      log.warn("Index "+indexName +" already exists. Will be deleted"); 

      final DeleteIndexRequestBuilder deleteIndexBuilder = myESclient.admin().indices().prepareDelete(indexName); 

      deleteIndexBuilder.execute().actionGet(); 
     } 

     final CreateIndexRequestBuilder createIndexBuilder = myESclient.admin().indices().prepareCreate(indexName) 
       .addMapping(typeName, mapCreator.getIndexFieldMapping()); 

     CreateIndexResponse createIndexResponse = createIndexBuilder.execute().actionGet(); 

     log.debug("Created mapping "+createIndexResponse.toString()); 

     myESclient.close(); 

    } 

    private String getIndexFieldMapping() throws IOException { 

     return IOUtils.toString(getClass().getClassLoader().getResourceAsStream(mappingFileName)); 
    } 

    private static Client getClient() { 

     TransportClient transportClient = null; 

     try 
     { 
      Settings settings = ImmutableSettings.settingsBuilder().put("cluster.name", clusterName).build(); 

      transportClient = new TransportClient(settings); 

      transportClient = transportClient.addTransportAddress(new InetSocketTransportAddress(hostName, 9300)); 

/* be very careful about the port number here. by default its 9300. note that this is the TCP port which the java api will use. unlike the http port which is 9200 */ 

     } 
     catch (Exception e) 
     { 
      log.error("Error in MappingCreator creating Elastic Search Client\n" 
        + "Message "+e.getMessage()+"\n" 
          + "StackTrace "+e.getStackTrace() 
        ); 
     } 

     return (Client) transportClient; 

    } 

} 

я надеюсь, что это помогает. кстати, это действительно здорово, что вы делаете свой собственный токенизатор nGram. я хотел бы видеть код для этого и как это делается :)