Java elasticsearch,通过部分单词查找

时间:2016-07-08 11:20:38

标签: java elasticsearch find

我对Java elasticsearch(2.3.3)

有一个小问题
TransportClient client = TransportClient.builder().build()
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
QueryBuilder qb = multiMatchQuery(
            "org", // George
            "firstname","lastname"

    ).fuzziness(Fuzziness.build(2));


    SearchResponse response = client.prepareSearch("user")
            .setQuery(qb)
            .execute()
            .get();

    for(SearchHit hit : response.getHits()){
        System.out.println(hit.getSource());
    }

通过模糊,当我没有输入2个字母时,我可以找到。

我希望它通过名字或姓氏,3个或更多字母来查找用户。 过去几个小时我一直在寻找一种方法。

在这种情况下,我需要找到" George Michel"通过键入" org",但没有运气。但有人可以输入" Gegorge Jackson"然后我应该找到" Geroge Michel"和迈克尔杰克逊"。

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

您可以在elasticsearch中使用NGram tokenizer。 NGram tokenizer有什么作用? 假设你有一个字符串“day”,所以它会将字符串拆分为 “d”,“a”,“y”,“da”,“ay”,“day”有助于搜索查询。 这确实有限制。最大和最小长度

更多信息:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html

答案 1 :(得分:1)

要搜索,如下面的代码可以使用。

例如:列名是地址 出现的价值观:

  1. 123,Springfield,68 Main Street,IL
  2. 248,Spring,104 Street,MA
  3. 搜索字符串:" spring"

    QueryBuilders.boolQuery().should(QueryBuilders.queryStringQuery("*"+spring+"*").lenient(true).field("Address"))
    

    以上两个结果都将返回,而在Code下面只返回一个(即2)结果。

    QueryBuilders.boolQuery().should(QueryBuilders.queryStringQuery("spring").lenient(true).field("Address"))
    

    注意在第一个查询构建器中我使用了' *'。

答案 2 :(得分:0)

我正在寻找并找到类似这样的东西:

XContentBuilder settingsBuilder = XContentFactory.jsonBuilder()
            .startObject()
                .startObject("analysis")
                .startObject("tokenizer")
                    .startObject("my_ngram_tokenizer")
                    .field("type","nGram")
                    .field("min_gram",1)
                    .field("max_gram",1)
                    .endObject()
                .endObject()
                .startObject("analyzer")
                    .startObject("ShingleAnalyzer")
                        .field("tokenizer","my_ngram_tokenizer")
                        .array("filter","standard","lowercase")
                    .endObject()
                .endObject()
                .endObject()
            .endObject();

    this.client.admin().indices()
            .prepareCreate("user").setSettings(settingsBuilder).get();

但没有改变,我做错了什么?哎哟。

编辑: 它仅适用于“geo”,但不能没有.fuzziness(Fuzziness.build(2));

QueryBuilder qb = multiMatchQuery(
            search,
            "firstname","lastname"
    ).analyzer("ShingleAnalyzer");