一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して6日目です。クリックしてイベントの詳細をご覧ください。
序文
5日目の更新アクティビティでは、kibanaを使用してesのクエリを呼び出す一般的なeコマースシナリオでのik単語セグメンテーション検索を完了しました。本日は、昨日の練習結果を春のブートプロジェクトに統合します
ハイライトを定義する
検索結果の強調表示を実現する場合は、最初に対応する結果に固定ロゴを追加して、レンダリング時に識別して強調表示できるようにする必要があります。最初に強調表示された応答本文を修正し、対応するインターフェイスは次のように定義されています
@RestController
@RequestMapping("es/search")
public class EsSearchController {
@GetMapping("html")
public void html(HttpServletResponse response) throws IOException {
response.setHeader("Content-Type", "text/html; charset=utf-8");
PrintWriter writer = response.getWriter();
writer.print(
"<html><body>" +
"颜色是<span class='red'>红色</span>" +
"</body>" +
"<style> .red{color:red }</style>" +
"</html>");
writer.flush();
writer.close();
}
}
复制代码
プロジェクトを開始します(プロジェクトがビルドされていない場合は、プロジェクトをダウンロードできます:gitee.com/liangminghu ... ip:port / es / search / htmlにアクセスして、次の効果を表示します
esでハイライトロゴを設定する方法
esで応答の強調表示ロゴを設定するには、highlightタグを使用する必要があります。「Huawei携帯電話001を例として」を検索してみましょう。デフォルトの昇順で、kibanaでのリクエストは次のとおりです。
post goods/_search
{
"query": {
"bool": {
"should": [{
"match": {
"name": "华为手机001"
}
},
{
"match": {
"keyWords": "华为手机001"
}
}
]
}
},
"highlight": {
"pre_tags": ["<span class='red'>"],
"post_tags": ["</span>"],
"fields": {
"name": {},
"keyWords": {}
}
},
"from": 0,
"size": 2,
"sort": {
"sort": "asc"
}
}
复制代码
前回の記事でクエリなどのタグについてはすでに説明しましたが、ここでは主にハイライトでタグを紹介します。
- pre_tags + post_tags:これらの2つのタグは、セグメント化された結果がどのタグで囲まれるかを定義します。これは、フロントエンドの効果と同様です<> </>
- フィールド:検索で強調表示する属性を定義します。nameは名前を強調表示する必要があることを意味し、keyWordsはキーワードを強調表示する必要があることを意味します\
注:インデックスを作成するときに、単語のセグメンテーションを検索するためにikに設定しました。デフォルトでインデックスを作成すると、esタグの単語のセグメンテーションが使用されます。
スプリングブーツを使用して検索を統合する
最初は、esを統合してikを検索するのは難しいと思いましたが、8.1.2のクライアントがjsonに基づくリクエスト本文のカプセル化をサポートしていることを知り、すぐに本当に香りがよいと感じました。次のコードのアイデアは次のとおりです。公式ドキュメント:es公式ドキュメント、それは最も簡単なはずですes検索を統合する方法
@GetMapping("doSearch")
public void doSearch(HttpServletResponse response, @RequestParam(value = "word") String word, @RequestParam(value = "sort", defaultValue = "sort") String sort) throws IOException {
if (StringUtils.isBlank(word)) {
return;
}
response.setHeader("Content-Type", "text/html; charset=utf-8");
//初始化estClient
RestClient restClient = RestClient.builder(
new HttpHost("127.0.0.1", 9200, "http")).build();
//设置请求方式和地址
Request request = new Request(
"POST",
"goods/_search");
//基于json构造查询
request.setJsonEntity("{\"query\":{\"bool\":{\"should\":" +
"[{\"match\":{\"name\":\"" + word + "\"}}," +
"{\"match\":{\"keyWords\":\"" + word + "\"}}]}}," +
"\"highlight\":{\"pre_tags\":[\"<span class='red'>\"]" +
",\"post_tags\":[\"</span>\"],\"fields\":{\"name\":{}," +
"\"keyWords\":{}}},\"from\":0,\"size\":5,\"sort\":{\"sort\":\"asc\"}}");
Response esRes = restClient.performRequest(request);
log.info("{}", esRes);
RequestLine requestLine = esRes.getRequestLine();
HttpHost host = esRes.getHost();
int statusCode = esRes.getStatusLine().getStatusCode();
Header[] headers = esRes.getHeaders();
String responseBody = EntityUtils.toString(esRes.getEntity());
##### log.info("{}{}{}{}{}", requestLine, host, statusCode, headers, responseBody);
restClient.close();
PrintWriter writer = response.getWriter();
writer.print(
"<html><body>" +
responseBody +
"</body>" +
"<style> .red{color:red }</style>" +
"</html>");
writer.flush();
writer.close();
}
复制代码
ここのクライアントは閉じる必要があることに注意してください。次のアドレスにアクセスして得られた結果は次のとおりです。
- Huawei Mobile 001を検索します:http://127.0.0.1:4001 / es / search / doSearch?word = Huawei Mobile 001
名前とキーワードの両方が2にヒットしたことがわかります。SosoKylin:http://127.0.0.1:4001/es/search/doSearch?word= kylin
キーワードのみがヒットしたことがわかります。
要約すると、スプリングブート統合es8.1.2ik単語セグメンテーションハイライト検索が完了しました。私たちはes関連の探索に6日間を費やしました、私はあなたがこの6日間で何かを得ることができることを願っています
エピローグ7
本日をもって、es関連の記事は当面終了しました。次の記事から、ビッグデータやタロイモのマルチエンド開発の実践から方向性を選んで記事を始めていきます。みんなが好きでサポートすることを歓迎します!\