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

Spring data elastic search - Query - Full text search

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

例如,

有6个字段需要索引。

1)名字 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)

此外,应该为其中一个领域提供提升。

例如,

当我搜索 "mike mat" 时,如果 firstName 中有任何匹配项,那应该是结果中的第一个,即使其他字段中有完全匹配项。

谢谢

不是 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

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

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

谢谢

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

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 职责分开。

希望对您有所帮助

谢谢

假设您的搜索词在变量 query 中,您可以在 ElasticsearchRepository.

中使用方法 search

repo.search(queryStringQuery(query))

要使用 queryStringQuery,请使用以下导入

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

QueryBuilder class 有助于查询从 spring Dao 到弹性搜索:

导入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")); 

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

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