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

时间:2015-11-02 14:18:18

标签: java elasticsearch full-text-search mappings

我对“弹性搜索”几乎是“新手”。我已经使用了一段时间,但从未使用过分析仪。

我可以对我的项目进行全文搜索,但问题是,当我尝试找到“ Alex ”之类的名称时,我应该完全键入名称。它不适用于“ Al ”或“ Ale ”。它说的是“找不到匹配”。

我从不同的网站找到了一些源代码,但这让我很困惑。

我该怎么做:

1)创建nGram标记生成器

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

我已经创建了很多索引,并且在创建映射时遇到了错误。

我应该在索引记录之前创建我的分析器设置并在初始化中进行映射吗?

我正在开发一个Java项目,因此非常感谢JAVA API的答案。

非常感谢!

1 个答案:

答案 0 :(得分:0)

应始终首先创建

映射,然后对数据编制索引。如果可能,删除旧索引并使用新映射重新创建。如果您担心丢失数据,那么只需为现有索引创建一个新类型。新类型可以使用新映射。

例如,这是一个使用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 tokenizer非常酷。我很乐意看到代码以及它是如何完成的:)