Spring Data ElasticSearch-查询-全文搜索

r6hnlfcb  于 2022-11-28  发布在  ElasticSearch
关注(0)|答案(7)|浏览(180)

我正在尝试使用ElasticSearch进行全文搜索,并使用Spring Data 将ElasticSearch与我的应用程序集成。
例如,
有6个字段要编制索引。
1)名字2)姓氏3)职务4)位置5)行业6)电子邮件
http://localhost:9200/test/_mapping/
我可以在Map中看到这些字段。
现在,我想使用搜索输入对这些字段进行搜索。
例如,当我搜索“mike 123”时,它必须对所有这6个字段进行搜索。
在Spring Data 存储库中,
下面的方法只适用于在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中有任何匹配,那么即使在其他字段中有完全匹配,也应该是结果中的第一个。
谢谢

x4shl7ld

x4shl7ld1#

假设您的搜索词位于变量query中,您可以在ElasticsearchRepository中使用方法search
repo.search(queryStringQuery(query))
要使用queryStringQuery,请使用以下导入
import static org.elasticsearch.index.query.QueryBuilders.queryStringQuery;

yhxst69z

yhxst69z2#

我找到了实现这一点的方法,并张贴在这里。希望,这会有所帮助。

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

谢谢

lh80um4z

lh80um4z3#

我不是spring-data elasticsearchMaven,但我认为有两个方向可以选择。第一个是使用@Query选项。这样你就可以创建自己的查询。第二个是使用Filter builder部分的示例: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

bn31dyow

bn31dyow4#

我们可以写我们自己的自定义查询如下。我们可以特定的索引,路由值(如果使用别名,这是使用)

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的职责中分离出来。
希望这对你有帮助
谢谢

6fe3ivhb

6fe3ivhb5#

QueryBuilder类有助于从Spring刀查询到ElasticSearch:
导入组织ElasticSearch索引查询;
导入组织ElasticSearch索引查询;

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"));
zzlelutf

zzlelutf6#

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

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

xcitsw887#

另一种方法是使用查询字符串查询

Query searchQuery = new StringQuery(
      "{\"query\":{\"query_string\":{\"query\":\""+ your-query-here + "\"}}}\"");
    
SearchHits<Product> products = elasticsearchOperations.search(
      searchQuery, 
      Product.class,
      IndexCoordinates.of(PRODUCT_INDEX_NAME));

这将搜索文档中指定索引的所有字段

相关问题