我正在尝试使用弹性搜索进行全文搜索,使用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中有任何匹配,那么即使在其他字段中存在完全匹配,也应该是结果中的第一个匹配。
由于
答案 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"
);
答案 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);