Должен ли я сопоставить все свои индексы с моим анализатором на ElasticSearch
Я "почти" новичок в Elastic Search. Я использовал это некоторое время, но никогда не использовал Анализаторы прежде.
Я могу выполнить полнотекстовый поиск по своему проекту, но проблема в том, что, когда я пытаюсь найти имя типа "Алекс", я должен полностью правильно ввести имя. Это не работает с "Al" или "Ale". Там написано что-то вроде "совпадения не найдено".
Я нашел некоторые исходники с разных сайтов, но это меня смущает.
Что я должен сделать, это:
1) Создание токенайзера nGram
2) Затем сопоставить все мои индексы?
У меня уже есть множество индексов, и я получил ошибки при создании сопоставления для них.
Должен ли я создавать настройки и отображение своего анализатора в самом начале, перед индексированием моих записей?
Я работаю над проектом Java, поэтому ответы на JAVA API будут очень благодарны.
Большое спасибо!
1 ответ
Сначала всегда должны создаваться отображения, а затем данные должны быть проиндексированы. если возможно, удалите свои старые индексы и заново создайте новое отображение. если вы обеспокоены потерей данных, просто создайте новый тип для существующего индекса. новый тип может использовать новое отображение.
например, вот кусок, который использует Java API для создания пользовательского сопоставления
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. Я хотел бы увидеть код для этого и как это делается:)