ElasticSearch:在java中搜索更像这样

时间:2014-10-29 16:52:50

标签: java elasticsearch

我们说我已将这样的文件编入索引:

{
    "_index": "indexapm",
    "_type": "membres",
    "_id": "3708",
    "_score": 1,
    "_source": {
          "firstname": "John",
          "lastname": "GUERET-TALON"
     }
}

我想在搜索" GUER"," GUERET"," TAL"例如。

我有一个Java应用程序,我试过这个:

MoreLikeThisQueryBuilder qb = QueryBuilders.moreLikeThisQuery(
            "firstname^3", 
            "lastname^3")
            .likeText("GUER");

SearchResponse response = client.prepareSearch("myindex")
            .setTypes("mytype")
            .setSearchType(SearchType.DFS_QUERY_AND_FETCH)
            .setQuery(qb)             // Query
            .setFrom(0)
            .setSize(limit)
            .setExplain(true)
            .execute()
            .actionGet();

但是此搜索无法检索我的文档。当然,如果我尝试完全匹配查询并搜索" GUERET",它可以工作。

有谁知道我必须使用哪种查询以及如何使它与Java库一起使用?谢谢!

2 个答案:

答案 0 :(得分:0)

在这种情况下,更像此查询并不是最佳选择。

如果您正如您所描述的那样,您使用首字母单词查找文档,则应使用前缀查询,但它们仅限于一个字段。要搜索多个字段,请使用MultiMatch Query(提供PHRASE_PREFIX类型)。我会尝试类似的东西:

QueryBuilders.multiMatchQuery("GUER", "firstname", "lastname")
    .type(MatchQueryBuilder.Type.PHRASE_PREFIX);

答案 1 :(得分:0)

QueryBuilders.boolQuery().should(QueryBuilders.wildcardQuery("lastname", "*GUER*"));

我使用WildcardQueryBuilder获得了结果,它生成了以下内容:

{"bool":{"should":[{"wildcard":{"firstname":"*GUER*"}}]}}