2017-04-23 70 views
1

在我的Spring Data Elasticsearch應用程序中,我想在用戶輸入幾個字符時實現自動完成功能,並且應用程序將向他顯示帶有query*的所有可能變體。如何使用彈簧數據搜索單詞的一部分elasticSearch

現在我無法找到一個方法如何正確地與Spring Data Elasticsearch一起實現它。

比如我試過如下:

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

它適用於單個詞的查詢,但在兩個或多個單詞情況下,它會返回錯誤:

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

如何正確地實現它這個案例?

回答

1

我有同樣的要求,我已經實現了相同。 Querystring將爲你工作。 如果您有兩個令牌,比如「安全窗口」,那麼您必須通過"*security* *windows*",而不是。查詢字符串將返回所有可用的可用數據。如果你有一個象「安全」的令牌,那麼你必須通過"*security*"

對於這種情況還有一個交代,檢查這個答案 - 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; 
相關問題