2017-06-12 3 views
1

SearchQueryで検索する際に、各ヒットのinvidual_scoreを確認して使用しようとしています。これは、とりわけ、検索結果の範囲がどのようなものかを知ることですが、searchQuery.withMinScore(float)を使用してMinScoreを設定する以外は、私は検索のスコアを処理するための方法を見つけることができません。春の各ヒットのスコアSearchQuery ElasticSearch

@Override 
public Page<Website> listsearch(SearchBody searchBody, int size, int page) { 
    BoolQueryBuilder qb = QueryBuilders.boolQuery(); 

    for(SearchUnit unit:searchBody.getSearchBody()){ 
     if(unit.isPriority()) { 
      qb.must(matchQuery("_all", unit.getWord()).operator(MatchQueryBuilder.Operator.AND) 
        .fuzziness(Fuzziness.AUTO)); 

     }else { 
      qb.should(termQuery("_all", unit.getWord()) 
        .boost(unit.getWeight())); 
     } 
    } 

    for(SearchUnit ExUnit:searchBody.getExcludeBody()){ 
     qb.mustNot(matchPhraseQuery("_all",ExUnit.getWord())); 
    } 

    SearchQuery searchQuery = new NativeSearchQueryBuilder() 
      .withIndices("websites_v1") 
      .withTypes("website") 
      .withQuery(qb) 
      .withMinScore(0.05F)//Magical minscore 
      .withPageable(new PageRequest(page, size)) 
      .build(); 


    Page<Website> search = searchRepository.search(searchQuery); 
    return search; 

} 

使用された検索機能は、org.springframework.data.elasticsearch.repositoryからです。

私の質問は、とにかくページの各返されたオブジェクトのスコアにアクセスできますか?または、クエリメソッドを別のものに切り替える必要がありますか?

+0

あなたは '_score'フィールドに各文書のスコアを見るべきです。あなたのサンプルの結果を得ることは良いことです。 –

+0

@MohammadMazraehしかし、どうすればアクセスできますか?ページに_scoreというフィールドが含まれていないようですか? –

答えて

1

これはSpring Data ElasticSearchリポジトリでは不可能です。

EntityMapperElasticSearchTemplateをautowireし、自分でスコアを抽出する必要があります。このようなものは、うまくいくはずです:

Pageable pageRequest = new PageRequest(0, 10); 
Page<Website> result = elasticSearchTemplate.query(searchQuery, new ResultsExtractor<Page<Website>>() { 
    @Override 
    public Page<Website> extract(SearchResponse response) { 
     List<Website> content = new ArrayList<>(); 
     SearchHit[] hits = response.getHits().getHits(); 
     for (SearchHit hit : hits) { 
      Website website = entityMapper.mapToObject(hit, Website.class); 
      content.add(website); 
      float documentScore = hit.getScore(); // <---- score of a hit 
     } 
     return new PageImpl<Website>(content, pageRequest, response.getHits().getTotalHits()); 
    } 
}); 
+0

entityMapperをオートワイヤリングする方法は?私はそれを試しても例外が見つかりませんでした。それに対する解決策はありますか? – Patrick

+0

@patrick '@Autowired EntityMapper entityMapper'は、' org.springframework.data.elasticsearch.core'パッケージに含まれていますので、Maven/Gradleの依存関係に 'spring-data-elasticsearch'があれば、それを見つけるはずです... – Aerus

+0

奇妙なことに私にとってはうまくいかない。私は[質問](https://stackoverflow.com/q/48830308/3493036)を提出して、自分のコードに間違いがないか、春のAPIに変更があるかどうかを確認しました。 – Patrick

関連する問題