2017-04-23 13 views
1

私のSpring Data Elasticsearchのアプリケーションでは、ユーザがいくつかの文字を入力してアプリケーションにquery*という可能なすべてのバリアントを表示するとき、オートコンプリート機能を実装したいと思います。springのデータで単語の一部を検索する方法elasticSearch

現在、私はSpring Data Elasticsearchで正しく実装する方法を見つけることができません。例えば

私は次のことを試してみました:

Criteria c = new Criteria("name").startsWith(query); 
return elasticsearchTemplate.queryForPage(new CriteriaQuery(c, pageRequest), ESDecision.class); 

単一の単語のクエリのために動作しますが、2つの以上の単語の場合には、それはエラーを返します:

"Cannot constructQuery '*"security windows"'. Use expression or multiple clauses instead." 

適切にそれを実装する方法この場合?

答えて

1

私は同じ要件を持っています、私は同じことを実装しました。 クエリスストリングがあなたに役立ちます。 "セキュリティウィンドウ"のような2つのトークンが"*security* *windows*"よりも大きい場合は、よりクエリ文字列が利用可能なすべてのデータを返します。 「セキュリティ」のようなトークンが1つある場合は、"*security*"を渡す必要があります。このシナリオの

つ以上のexplaination、この答えをチェック - https://stackoverflow.com/a/43278852/2357869

String aQueryString = "security windows" ; 
String aQueryWithPartialSerach = null; 
List<ESDecision> aESDecisions = null; 


// Enabling partial sarch 
     if (aQueryString.contains(" ")) { 
      List<String> aTokenList = Arrays.asList(aQueryString.split(" ")); 
      aQueryWithPartialSerach = String.join(" ", aTokenList.stream().map(p -> "*" + p + "*").collect(Collectors.toList())); 
     } else { 
      aQueryWithPartialSerach = "*" + aQueryString + "*"; 
     } 
NativeSearchQueryBuilder aNativeSearchQueryBuilder = new NativeSearchQueryBuilder(); 
     aNativeSearchQueryBuilder.withIndices(indexName).withTypes(type).withPageable(new PageRequest(0, iPageRequestCount)); 
     final BoolQueryBuilder aQuery = new BoolQueryBuilder(); 

      aQuery.must(QueryBuilders.queryStringQuery(aQueryWithPartialSerach).defaultField("name")); 

    NativeSearchQuery nativeSearchQuery = aNativeSearchQueryBuilder.withQuery(aQuery).build(); 
     aESDecisions = elasticsearchTemplate.queryForList(nativeSearchQuery, ESDecision.class); 
     return aESDecisions; 

輸入が行われる必要があります: -

import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; 
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; 
import org.springframework.data.elasticsearch.core.query.SearchQuery; 
import org.springframework.data.domain.PageRequest; 
import org.elasticsearch.index.query.BoolQueryBuilder; 
import org.elasticsearch.index.query.QueryBuilders; 
関連する問題