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"
);
我找到了实现此目的的方法并在此处发布。希望,这会有所帮助。
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);
我正在尝试使用弹性搜索进行全文搜索,并使用 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"
);
我找到了实现此目的的方法并在此处发布。希望,这会有所帮助。
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);