5

我正在尝试使用弹性搜索进行全文搜索和使用 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”时,如果名字中有任何匹配项,即使其他字段完全匹配,那也应该是结果中的第一个。

谢谢

4

6 回答 6

7

假设您的搜索词在变量query中,您可以使用searchin 中的方法ElasticsearchRepository

repo.search(queryStringQuery(query))

使用 queryStringQuery 使用以下导入

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

于 2016-10-08T10:47:34.520 回答
5

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

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

谢谢

于 2015-04-06T16:01:46.820 回答
1

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

在弹性搜索中,您可能希望使用 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

于 2015-04-06T12:09:54.443 回答
1

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

QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery(query)
              .field("name", 2.0f)
              .field("email")
              .field("title")
              .field("jobDescription", 3.0f)
              .type(MultiMatchQueryBuilder.Type.PHRASE_PREFIX);
于 2019-08-11T00:36:50.010 回答
1

QueryBuilder 类有助于从 spring Dao 查询到 elastic search:

导入 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")); 
于 2018-10-21T04:52:55.340 回答
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 职责分开。

希望这可以帮助

谢谢

于 2016-04-10T14:50:37.470 回答