Spring数据弹性搜索 - 查询 - 全文搜索

时间:2015-04-05 19:22:52

标签: elasticsearch spring-data spring-data-elasticsearch

我正在尝试使用弹性搜索进行全文搜索,使用Spring数据将弹性搜索与我的应用程序集成。

例如,

有6个要编入索引的字段。

1)的firstName  2)姓氏  3)称号  4)位置  5)行业  6)电子邮件

http://localhost:9200/test/_mapping/

我可以在映射中看到这些字段。

现在,我想通过搜索输入对这些字段进行搜索。

例如,当我搜索" mike 123"时,它必须搜索所有这6个字段。

在Spring数据存储库中,

以下方法仅适用于firstName。

Collection<Object> findByFirstNameLike(String searchInput)

但是,我想搜索所有字段。

我试过了,

Collection<Object> findByFirstNameLikeOrLastNameLikeOrTitleLikeOrLocationLikeOrIndustryLikeOrEmailLike(String searchInput,String searchInput1,String searchInput2,String searchInput3,)

这里,即使输入字符串相同,我需要传递与6个参数相同的输入。此方法名称在多个字段中看起来更大。

无论如何使用@Query或....

像,

Collection<Object> findByInput(String inputString)

此外,应该为其中一个领域提供助推器。

例如,

当我搜索&#34; mike mat&#34;时,如果firstName中有任何匹配,那么即使在其他字段中存在完全匹配,也应该是结果中的第一个匹配。

由于

6 个答案:

答案 0 :(得分:6)

假设您的搜索字词位于变量query中,您可以使用search中的方法ElasticsearchRepository

repo.search(queryStringQuery(query))

使用queryStringQuery使用以下导入

import static org.elasticsearch.index.query.QueryBuilders.queryStringQuery;

答案 1 :(得分:4)

我找到了实现这一目标并在此处发布的方法。希望,这会有所帮助。

QueryBuilder queryBuilder = boolQuery().should(
                    queryString("Mike Mat").analyzeWildcard(true)
                            .field("firstName", 2.0f).field("lastName").field("title")
                            .field("location").field("industry").field("email"));

由于

答案 2 :(得分:1)

不是spring-data elasticsearch专家。但我看到你可以去的两个方向。第一个是使用@Query选项。这样您就可以创建自己的查询。第二个是使用“过滤器”构建器部分中的示例: http://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.misc.filter

在elasticearch中,您可能希望使用multi_match查询: http://www.elastic.co/guide/en/elasticsearch/reference/1.5/query-dsl-multi-match-query.html

在java中,这样的查询看起来像这样:

QueryBuilder qb = multiMatchQuery(
    "kimchy elasticsearch", 
    "user", "message"       
);

示例来自:http://www.elastic.co/guide/en/elasticsearch/client/java-api/current/query-dsl-queries.html#multimatch

答案 3 :(得分:1)

我们可以编写自己的自定义查询,如下所示。 我们可以使用特定的索引,路由值(如果使用了别名,则使用此值)

SearchQuery searchQuery = new NativeSearchQueryBuilder().withIndices(INDEX)
            .withRoute(yourQueryBuilderHelper.getRouteValue())
            .withQuery(yourQueryBuilderHelper.buildQuery(yourSearchFilterRequestObject))
            .withFilter(yourQueryBuilderHelper.buildFilter(yourSearchFilterRequestObject)).withTypes(TYPE)
            .withSort(yourQueryBuilderHelper.buildSortCriteria(yourSearchFilterRequestObject))
            .withPageable(yourQueryBuilderHelper.buildPaginationCriteria(yourSearchFilterRequestObject)).build();
    FacetedPage<Ticket> searchResults = elasticsearchTemplate.queryForPage(searchQuery, YourDocumentEntity.class);

很高兴使用你自己的queryBuilder帮助程序,它可以将你的elasticSearchService与queryBuilder职责分开。

希望这有帮助

由于

答案 4 :(得分:0)

QueryBuilder类有助于从Spring Da到弹性搜索的查询:

导入org.elasticsearch.index.query.QueryBuilders;

导入org.elasticsearch.index.query.QueryBuilder;

    QueryBuilder qb = QueryBuilders.boolQuery()
            .must(QueryBuilders.termQuery("state", "KA"));
            .must(QueryBuilders.termQuery("content", "test4"))
            .mustNot(QueryBuilders.termQuery("content", "test2"))
            .should(termQuery("content", "test3"));
            .should(termQuery("content", "test3")); 

答案 5 :(得分:0)

尝试这样,您甚至可以设置字段的重要性

QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery(query)
              .field("name", 2.0f)
              .field("email")
              .field("title")
              .field("jobDescription", 3.0f)
              .type(MultiMatchQueryBuilder.Type.PHRASE_PREFIX);