繁体   English   中英

我是否应该在ElasticSearch上使用分析器映射所有索引

[英]Should I map all my indexes with my analyzer on ElasticSearch

我是Elastic Search的“新手”。 我已经使用了一段时间,但之前从未使用过分析器。

我可以在我的项目中进行全文搜索,但是问题是,当我尝试查找“ Alex ”之类的名称时,我应该完全正确地键入该名称。 它不适用于“ Al ”或“ Ale ”。 上面写着“找不到匹配项”。

我从不同的站点找到了一些源代码,但这使我感到困惑。

我应该怎么做:

1)创建一个nGram标记器

2)然后将其与我的所有索引映射?

我已经创建了许多索引,并且在它们上创建映射时出现错误。

我是否应该在索引记录之前就在开始时就创建分析器设置和映射?

我正在研究Java项目,因此非常感谢JAVA API的答案。

非常感谢!

应该始终先创建映射,然后再对数据建立索引。 如果可能,请删除旧索引,然后使用新映射重新创建。 如果您担心丢失数据,则只需为现有索引创建一个新类型。 新类型可以使用新映射。

例如,以下是使用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标记程序真的很酷。 我很想看看它的代码以及它是如何完成的:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM