├── .gitignore ├── .mvn └── wrapper │ ├── maven-wrapper.jar │ └── maven-wrapper.properties ├── mvnw ├── mvnw.cmd ├── pom.xml └── src ├── main ├── java │ └── cn │ │ └── thislx │ │ └── springbootes │ │ ├── EsController.java │ │ ├── SpringbootEsApplication.java │ │ ├── bean │ │ ├── EsModel.java │ │ └── EsPage.java │ │ ├── config │ │ └── ElasticsearchConfig.java │ │ └── utils │ │ └── ElasticsearchUtil.java └── resources │ └── application.properties └── test └── java └── cn └── thislx └── springbootes └── SpringbootEsApplicationTests.java /.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | 4 | ### STS ### 5 | .apt_generated 6 | .classpath 7 | .factorypath 8 | .project 9 | .settings 10 | .springBeans 11 | .sts4-cache 12 | 13 | ### IntelliJ IDEA ### 14 | .idea 15 | *.iws 16 | *.iml 17 | *.ipr 18 | 19 | ### NetBeans ### 20 | /nbproject/private/ 21 | /build/ 22 | /nbbuild/ 23 | /dist/ 24 | /nbdist/ 25 | /.nb-gradle/ -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lxwjq/SpringBoot-ElasticSearch/2a07436bdb300d47e62d54e675cd96ec0c96e6e3/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.5.4/apache-maven-3.5.4-bin.zip 2 | -------------------------------------------------------------------------------- /mvnw: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # ---------------------------------------------------------------------------- 3 | # Licensed to the Apache Software Foundation (ASF) under one 4 | # or more contributor license agreements. See the NOTICE file 5 | # distributed with this work for additional information 6 | # regarding copyright ownership. The ASF licenses this file 7 | # to you under the Apache License, Version 2.0 (the 8 | # "License"); you may not use this file except in compliance 9 | # with the License. You may obtain a copy of the License at 10 | # 11 | # http://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, 14 | # software distributed under the License is distributed on an 15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | # KIND, either express or implied. See the License for the 17 | # specific language governing permissions and limitations 18 | # under the License. 19 | # ---------------------------------------------------------------------------- 20 | 21 | # ---------------------------------------------------------------------------- 22 | # Maven2 Start Up Batch script 23 | # 24 | # Required ENV vars: 25 | # ------------------ 26 | # JAVA_HOME - location of a JDK home dir 27 | # 28 | # Optional ENV vars 29 | # ----------------- 30 | # M2_HOME - location of maven2's installed home dir 31 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven 32 | # e.g. to debug Maven itself, use 33 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 34 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files 35 | # ---------------------------------------------------------------------------- 36 | 37 | if [ -z "$MAVEN_SKIP_RC" ] ; then 38 | 39 | if [ -f /etc/mavenrc ] ; then 40 | . /etc/mavenrc 41 | fi 42 | 43 | if [ -f "$HOME/.mavenrc" ] ; then 44 | . "$HOME/.mavenrc" 45 | fi 46 | 47 | fi 48 | 49 | # OS specific support. $var _must_ be set to either true or false. 50 | cygwin=false; 51 | darwin=false; 52 | mingw=false 53 | case "`uname`" in 54 | CYGWIN*) cygwin=true ;; 55 | MINGW*) mingw=true;; 56 | Darwin*) darwin=true 57 | # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home 58 | # See https://developer.apple.com/library/mac/qa/qa1170/_index.html 59 | if [ -z "$JAVA_HOME" ]; then 60 | if [ -x "/usr/libexec/java_home" ]; then 61 | export JAVA_HOME="`/usr/libexec/java_home`" 62 | else 63 | export JAVA_HOME="/Library/Java/Home" 64 | fi 65 | fi 66 | ;; 67 | esac 68 | 69 | if [ -z "$JAVA_HOME" ] ; then 70 | if [ -r /etc/gentoo-release ] ; then 71 | JAVA_HOME=`java-config --jre-home` 72 | fi 73 | fi 74 | 75 | if [ -z "$M2_HOME" ] ; then 76 | ## resolve links - $0 may be a link to maven's home 77 | PRG="$0" 78 | 79 | # need this for relative symlinks 80 | while [ -h "$PRG" ] ; do 81 | ls=`ls -ld "$PRG"` 82 | link=`expr "$ls" : '.*-> \(.*\)$'` 83 | if expr "$link" : '/.*' > /dev/null; then 84 | PRG="$link" 85 | else 86 | PRG="`dirname "$PRG"`/$link" 87 | fi 88 | done 89 | 90 | saveddir=`pwd` 91 | 92 | M2_HOME=`dirname "$PRG"`/.. 93 | 94 | # make it fully qualified 95 | M2_HOME=`cd "$M2_HOME" && pwd` 96 | 97 | cd "$saveddir" 98 | # echo Using m2 at $M2_HOME 99 | fi 100 | 101 | # For Cygwin, ensure paths are in UNIX format before anything is touched 102 | if $cygwin ; then 103 | [ -n "$M2_HOME" ] && 104 | M2_HOME=`cygpath --unix "$M2_HOME"` 105 | [ -n "$JAVA_HOME" ] && 106 | JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 107 | [ -n "$CLASSPATH" ] && 108 | CLASSPATH=`cygpath --path --unix "$CLASSPATH"` 109 | fi 110 | 111 | # For Mingw, ensure paths are in UNIX format before anything is touched 112 | if $mingw ; then 113 | [ -n "$M2_HOME" ] && 114 | M2_HOME="`(cd "$M2_HOME"; pwd)`" 115 | [ -n "$JAVA_HOME" ] && 116 | JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" 117 | # TODO classpath? 118 | fi 119 | 120 | if [ -z "$JAVA_HOME" ]; then 121 | javaExecutable="`which javac`" 122 | if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then 123 | # readlink(1) is not available as standard on Solaris 10. 124 | readLink=`which readlink` 125 | if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then 126 | if $darwin ; then 127 | javaHome="`dirname \"$javaExecutable\"`" 128 | javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" 129 | else 130 | javaExecutable="`readlink -f \"$javaExecutable\"`" 131 | fi 132 | javaHome="`dirname \"$javaExecutable\"`" 133 | javaHome=`expr "$javaHome" : '\(.*\)/bin'` 134 | JAVA_HOME="$javaHome" 135 | export JAVA_HOME 136 | fi 137 | fi 138 | fi 139 | 140 | if [ -z "$JAVACMD" ] ; then 141 | if [ -n "$JAVA_HOME" ] ; then 142 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 143 | # IBM's JDK on AIX uses strange locations for the executables 144 | JAVACMD="$JAVA_HOME/jre/sh/java" 145 | else 146 | JAVACMD="$JAVA_HOME/bin/java" 147 | fi 148 | else 149 | JAVACMD="`which java`" 150 | fi 151 | fi 152 | 153 | if [ ! -x "$JAVACMD" ] ; then 154 | echo "Error: JAVA_HOME is not defined correctly." >&2 155 | echo " We cannot execute $JAVACMD" >&2 156 | exit 1 157 | fi 158 | 159 | if [ -z "$JAVA_HOME" ] ; then 160 | echo "Warning: JAVA_HOME environment variable is not set." 161 | fi 162 | 163 | CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher 164 | 165 | # traverses directory structure from process work directory to filesystem root 166 | # first directory with .mvn subdirectory is considered project base directory 167 | find_maven_basedir() { 168 | 169 | if [ -z "$1" ] 170 | then 171 | echo "Path not specified to find_maven_basedir" 172 | return 1 173 | fi 174 | 175 | basedir="$1" 176 | wdir="$1" 177 | while [ "$wdir" != '/' ] ; do 178 | if [ -d "$wdir"/.mvn ] ; then 179 | basedir=$wdir 180 | break 181 | fi 182 | # workaround for JBEAP-8937 (on Solaris 10/Sparc) 183 | if [ -d "${wdir}" ]; then 184 | wdir=`cd "$wdir/.."; pwd` 185 | fi 186 | # end of workaround 187 | done 188 | echo "${basedir}" 189 | } 190 | 191 | # concatenates all lines of a file 192 | concat_lines() { 193 | if [ -f "$1" ]; then 194 | echo "$(tr -s '\n' ' ' < "$1")" 195 | fi 196 | } 197 | 198 | BASE_DIR=`find_maven_basedir "$(pwd)"` 199 | if [ -z "$BASE_DIR" ]; then 200 | exit 1; 201 | fi 202 | 203 | ########################################################################################## 204 | # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 205 | # This allows using the maven wrapper in projects that prohibit checking in binary data. 206 | ########################################################################################## 207 | if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then 208 | if [ "$MVNW_VERBOSE" = true ]; then 209 | echo "Found .mvn/wrapper/maven-wrapper.jar" 210 | fi 211 | else 212 | if [ "$MVNW_VERBOSE" = true ]; then 213 | echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." 214 | fi 215 | jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" 216 | while IFS="=" read key value; do 217 | case "$key" in (wrapperUrl) jarUrl="$value"; break ;; 218 | esac 219 | done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" 220 | if [ "$MVNW_VERBOSE" = true ]; then 221 | echo "Downloading from: $jarUrl" 222 | fi 223 | wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" 224 | 225 | if command -v wget > /dev/null; then 226 | if [ "$MVNW_VERBOSE" = true ]; then 227 | echo "Found wget ... using wget" 228 | fi 229 | wget "$jarUrl" -O "$wrapperJarPath" 230 | elif command -v curl > /dev/null; then 231 | if [ "$MVNW_VERBOSE" = true ]; then 232 | echo "Found curl ... using curl" 233 | fi 234 | curl -o "$wrapperJarPath" "$jarUrl" 235 | else 236 | if [ "$MVNW_VERBOSE" = true ]; then 237 | echo "Falling back to using Java to download" 238 | fi 239 | javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" 240 | if [ -e "$javaClass" ]; then 241 | if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then 242 | if [ "$MVNW_VERBOSE" = true ]; then 243 | echo " - Compiling MavenWrapperDownloader.java ..." 244 | fi 245 | # Compiling the Java class 246 | ("$JAVA_HOME/bin/javac" "$javaClass") 247 | fi 248 | if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then 249 | # Running the downloader 250 | if [ "$MVNW_VERBOSE" = true ]; then 251 | echo " - Running MavenWrapperDownloader.java ..." 252 | fi 253 | ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") 254 | fi 255 | fi 256 | fi 257 | fi 258 | ########################################################################################## 259 | # End of extension 260 | ########################################################################################## 261 | 262 | export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} 263 | if [ "$MVNW_VERBOSE" = true ]; then 264 | echo $MAVEN_PROJECTBASEDIR 265 | fi 266 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" 267 | 268 | # For Cygwin, switch paths to Windows format before running java 269 | if $cygwin; then 270 | [ -n "$M2_HOME" ] && 271 | M2_HOME=`cygpath --path --windows "$M2_HOME"` 272 | [ -n "$JAVA_HOME" ] && 273 | JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` 274 | [ -n "$CLASSPATH" ] && 275 | CLASSPATH=`cygpath --path --windows "$CLASSPATH"` 276 | [ -n "$MAVEN_PROJECTBASEDIR" ] && 277 | MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` 278 | fi 279 | 280 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 281 | 282 | exec "$JAVACMD" \ 283 | $MAVEN_OPTS \ 284 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ 285 | "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ 286 | ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" 287 | -------------------------------------------------------------------------------- /mvnw.cmd: -------------------------------------------------------------------------------- 1 | @REM ---------------------------------------------------------------------------- 2 | @REM Licensed to the Apache Software Foundation (ASF) under one 3 | @REM or more contributor license agreements. See the NOTICE file 4 | @REM distributed with this work for additional information 5 | @REM regarding copyright ownership. The ASF licenses this file 6 | @REM to you under the Apache License, Version 2.0 (the 7 | @REM "License"); you may not use this file except in compliance 8 | @REM with the License. You may obtain a copy of the License at 9 | @REM 10 | @REM http://www.apache.org/licenses/LICENSE-2.0 11 | @REM 12 | @REM Unless required by applicable law or agreed to in writing, 13 | @REM software distributed under the License is distributed on an 14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | @REM KIND, either express or implied. See the License for the 16 | @REM specific language governing permissions and limitations 17 | @REM under the License. 18 | @REM ---------------------------------------------------------------------------- 19 | 20 | @REM ---------------------------------------------------------------------------- 21 | @REM Maven2 Start Up Batch script 22 | @REM 23 | @REM Required ENV vars: 24 | @REM JAVA_HOME - location of a JDK home dir 25 | @REM 26 | @REM Optional ENV vars 27 | @REM M2_HOME - location of maven2's installed home dir 28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands 29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending 30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven 31 | @REM e.g. to debug Maven itself, use 32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files 34 | @REM ---------------------------------------------------------------------------- 35 | 36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' 37 | @echo off 38 | @REM set title of command window 39 | title %0 40 | @REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' 41 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% 42 | 43 | @REM set %HOME% to equivalent of $HOME 44 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") 45 | 46 | @REM Execute a user defined script before this one 47 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre 48 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending 49 | if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" 50 | if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" 51 | :skipRcPre 52 | 53 | @setlocal 54 | 55 | set ERROR_CODE=0 56 | 57 | @REM To isolate internal variables from possible post scripts, we use another setlocal 58 | @setlocal 59 | 60 | @REM ==== START VALIDATION ==== 61 | if not "%JAVA_HOME%" == "" goto OkJHome 62 | 63 | echo. 64 | echo Error: JAVA_HOME not found in your environment. >&2 65 | echo Please set the JAVA_HOME variable in your environment to match the >&2 66 | echo location of your Java installation. >&2 67 | echo. 68 | goto error 69 | 70 | :OkJHome 71 | if exist "%JAVA_HOME%\bin\java.exe" goto init 72 | 73 | echo. 74 | echo Error: JAVA_HOME is set to an invalid directory. >&2 75 | echo JAVA_HOME = "%JAVA_HOME%" >&2 76 | echo Please set the JAVA_HOME variable in your environment to match the >&2 77 | echo location of your Java installation. >&2 78 | echo. 79 | goto error 80 | 81 | @REM ==== END VALIDATION ==== 82 | 83 | :init 84 | 85 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". 86 | @REM Fallback to current working directory if not found. 87 | 88 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% 89 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir 90 | 91 | set EXEC_DIR=%CD% 92 | set WDIR=%EXEC_DIR% 93 | :findBaseDir 94 | IF EXIST "%WDIR%"\.mvn goto baseDirFound 95 | cd .. 96 | IF "%WDIR%"=="%CD%" goto baseDirNotFound 97 | set WDIR=%CD% 98 | goto findBaseDir 99 | 100 | :baseDirFound 101 | set MAVEN_PROJECTBASEDIR=%WDIR% 102 | cd "%EXEC_DIR%" 103 | goto endDetectBaseDir 104 | 105 | :baseDirNotFound 106 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR% 107 | cd "%EXEC_DIR%" 108 | 109 | :endDetectBaseDir 110 | 111 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig 112 | 113 | @setlocal EnableExtensions EnableDelayedExpansion 114 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a 115 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% 116 | 117 | :endReadAdditionalConfig 118 | 119 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" 120 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" 121 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 122 | 123 | set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" 124 | FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO ( 125 | IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B 126 | ) 127 | 128 | @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 129 | @REM This allows using the maven wrapper in projects that prohibit checking in binary data. 130 | if exist %WRAPPER_JAR% ( 131 | echo Found %WRAPPER_JAR% 132 | ) else ( 133 | echo Couldn't find %WRAPPER_JAR%, downloading it ... 134 | echo Downloading from: %DOWNLOAD_URL% 135 | powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')" 136 | echo Finished downloading %WRAPPER_JAR% 137 | ) 138 | @REM End of extension 139 | 140 | %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* 141 | if ERRORLEVEL 1 goto error 142 | goto end 143 | 144 | :error 145 | set ERROR_CODE=1 146 | 147 | :end 148 | @endlocal & set ERROR_CODE=%ERROR_CODE% 149 | 150 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost 151 | @REM check for post script, once with legacy .bat ending and once with .cmd ending 152 | if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" 153 | if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" 154 | :skipRcPost 155 | 156 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' 157 | if "%MAVEN_BATCH_PAUSE%" == "on" pause 158 | 159 | if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% 160 | 161 | exit /B %ERROR_CODE% 162 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | cn.thislx 7 | springboot-es 8 | 0.0.1-SNAPSHOT 9 | jar 10 | 11 | springboot-es 12 | Demo project for Spring Boot 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 2.1.0.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | UTF-8 24 | 1.8 25 | 26 | 27 | 28 | 29 | org.springframework.boot 30 | spring-boot-starter-web 31 | 32 | 33 | 34 | org.springframework.boot 35 | spring-boot-starter-test 36 | test 37 | 38 | 39 | 40 | 41 | org.elasticsearch 42 | elasticsearch 43 | 6.4.2 44 | 45 | 46 | 47 | 48 | org.elasticsearch.client 49 | transport 50 | 6.4.2 51 | 52 | 53 | org.elasticsearch 54 | elasticsearch 55 | 56 | 57 | 58 | 59 | 60 | com.alibaba 61 | fastjson 62 | 1.2.39 63 | 64 | 65 | 66 | org.apache.commons 67 | commons-lang3 68 | 3.4 69 | 70 | 71 | 72 | 73 | org.projectlombok 74 | lombok 75 | 1.16.20 76 | 77 | 78 | commons-httpclient 79 | commons-httpclient 80 | 3.1 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | org.springframework.boot 89 | spring-boot-maven-plugin 90 | 91 | 92 | 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /src/main/java/cn/thislx/springbootes/EsController.java: -------------------------------------------------------------------------------- 1 | package cn.thislx.springbootes; 2 | 3 | import cn.thislx.springbootes.bean.EsModel; 4 | import cn.thislx.springbootes.bean.EsPage; 5 | import cn.thislx.springbootes.utils.ElasticsearchUtil; 6 | import com.alibaba.fastjson.JSONObject; 7 | import org.apache.commons.httpclient.util.DateUtil; 8 | import org.apache.commons.lang3.StringUtils; 9 | import org.elasticsearch.index.query.BoolQueryBuilder; 10 | import org.elasticsearch.index.query.QueryBuilder; 11 | import org.elasticsearch.index.query.QueryBuilders; 12 | import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 13 | import org.springframework.web.bind.annotation.RequestMapping; 14 | import org.springframework.web.bind.annotation.RestController; 15 | 16 | import javax.servlet.http.HttpServletRequest; 17 | import javax.servlet.http.HttpServletResponse; 18 | import java.util.Date; 19 | import java.util.List; 20 | import java.util.Map; 21 | import java.util.Random; 22 | 23 | /** 24 | * @Author: LX 25 | * @Description: 26 | * @Date: Created in 11:23 2018/11/6 27 | * @Modified by: 28 | */ 29 | @RestController 30 | @RequestMapping("/es") 31 | public class EsController { 32 | 33 | /** 34 | * 测试索引 35 | */ 36 | private String indexName = "test_index"; 37 | 38 | /** 39 | * 类型 40 | */ 41 | private String esType = "external"; 42 | 43 | /** 44 | * http://127.0.0.1:8080/es/createIndex 45 | * 创建索引 46 | * 47 | * @param request 48 | * @param response 49 | * @return 50 | */ 51 | @RequestMapping("/createIndex") 52 | public String createIndex(HttpServletRequest request, HttpServletResponse response) { 53 | if (!ElasticsearchUtil.isIndexExist(indexName)) { 54 | ElasticsearchUtil.createIndex(indexName); 55 | } else { 56 | return "索引已经存在"; 57 | } 58 | return "索引创建成功"; 59 | } 60 | 61 | /** 62 | * 插入记录 63 | * 64 | * @return 65 | */ 66 | @RequestMapping("/insertJson") 67 | public String insertJson() { 68 | JSONObject jsonObject = new JSONObject(); 69 | jsonObject.put("id", DateUtil.formatDate(new Date())); 70 | jsonObject.put("age", 25); 71 | jsonObject.put("name", "j-" + new Random(100).nextInt()); 72 | jsonObject.put("date", new Date()); 73 | String id = ElasticsearchUtil.addData(jsonObject, indexName, esType, jsonObject.getString("id")); 74 | return id; 75 | } 76 | 77 | /** 78 | * 插入记录 79 | * 80 | * @return 81 | */ 82 | @RequestMapping("/insertModel") 83 | public String insertModel() { 84 | EsModel esModel = new EsModel(); 85 | esModel.setId(DateUtil.formatDate(new Date())); 86 | esModel.setName("m-" + new Random(100).nextInt()); 87 | esModel.setAge(30); 88 | esModel.setDate(new Date()); 89 | JSONObject jsonObject = (JSONObject) JSONObject.toJSON(esModel); 90 | String id = ElasticsearchUtil.addData(jsonObject, indexName, esType, jsonObject.getString("id")); 91 | return id; 92 | } 93 | 94 | /** 95 | * 删除记录 96 | * 97 | * @return 98 | */ 99 | @RequestMapping("/delete") 100 | public String delete(String id) { 101 | if (StringUtils.isNotBlank(id)) { 102 | ElasticsearchUtil.deleteDataById(indexName, esType, id); 103 | return "删除id=" + id; 104 | } else { 105 | return "id为空"; 106 | } 107 | } 108 | 109 | /** 110 | * 更新数据 111 | * 112 | * @return 113 | */ 114 | @RequestMapping("/update") 115 | public String update(String id) { 116 | if (StringUtils.isNotBlank(id)) { 117 | JSONObject jsonObject = new JSONObject(); 118 | jsonObject.put("id", id); 119 | jsonObject.put("age", 31); 120 | jsonObject.put("name", "修改"); 121 | jsonObject.put("date", new Date()); 122 | ElasticsearchUtil.updateDataById(jsonObject, indexName, esType, id); 123 | return "id=" + id; 124 | } else { 125 | return "id为空"; 126 | } 127 | } 128 | 129 | /** 130 | * 获取数据 131 | * http://127.0.0.1:8080/es/getData?id=2018-04-25%2016:33:44 132 | * 133 | * @param id 134 | * @return 135 | */ 136 | @RequestMapping("/getData") 137 | public String getData(String id) { 138 | if (StringUtils.isNotBlank(id)) { 139 | Map map = ElasticsearchUtil.searchDataById(indexName, esType, id, null); 140 | return JSONObject.toJSONString(map); 141 | } else { 142 | return "id为空"; 143 | } 144 | } 145 | 146 | /** 147 | * 查询数据 148 | * 模糊查询 149 | * 150 | * @return 151 | */ 152 | @RequestMapping("/queryMatchData") 153 | public String queryMatchData() { 154 | BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); 155 | boolean matchPhrase = false; 156 | if (matchPhrase == Boolean.TRUE) { 157 | //不进行分词搜索 158 | boolQuery.must(QueryBuilders.matchPhraseQuery("name", "m")); 159 | } else { 160 | boolQuery.must(QueryBuilders.matchQuery("name", "m-m")); 161 | } 162 | List> list = ElasticsearchUtil. 163 | searchListData(indexName, esType, boolQuery, 10, "name", null, "name"); 164 | return JSONObject.toJSONString(list); 165 | } 166 | 167 | /** 168 | * 通配符查询数据 169 | * 通配符查询 ?用来匹配1个任意字符,*用来匹配零个或者多个字符 170 | * 171 | * @return 172 | */ 173 | @RequestMapping("/queryWildcardData") 174 | public String queryWildcardData() { 175 | QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("name.keyword", "j-?466"); 176 | List> list = ElasticsearchUtil.searchListData(indexName, esType, queryBuilder, 10, null, null, null); 177 | return JSONObject.toJSONString(list); 178 | } 179 | 180 | /** 181 | * 正则查询 182 | * 183 | * @return 184 | */ 185 | @RequestMapping("/queryRegexpData") 186 | public String queryRegexpData() { 187 | QueryBuilder queryBuilder = QueryBuilders.regexpQuery("name.keyword", "m--[0-9]{1,11}"); 188 | List> list = ElasticsearchUtil.searchListData(indexName, esType, queryBuilder, 10, null, null, null); 189 | return JSONObject.toJSONString(list); 190 | } 191 | 192 | /** 193 | * 查询数字范围数据 194 | * 195 | * @return 196 | */ 197 | @RequestMapping("/queryIntRangeData") 198 | public String queryIntRangeData() { 199 | BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); 200 | boolQuery.must(QueryBuilders.rangeQuery("age").from(21) 201 | .to(25)); 202 | List> list = ElasticsearchUtil.searchListData(indexName, esType, boolQuery, 10, null, null, null); 203 | return JSONObject.toJSONString(list); 204 | } 205 | 206 | /** 207 | * 查询日期范围数据 208 | * 209 | * @return 210 | */ 211 | @RequestMapping("/queryDateRangeData") 212 | public String queryDateRangeData() { 213 | BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); 214 | boolQuery.must(QueryBuilders.rangeQuery("date").from("2018-04-25T08:33:44.840Z") 215 | .to("2019-04-25T10:03:08.081Z")); 216 | List> list = ElasticsearchUtil.searchListData(indexName, esType, boolQuery, 10, null, null, null); 217 | return JSONObject.toJSONString(list); 218 | } 219 | 220 | /** 221 | * 查询分页 222 | * 223 | * @param startPage 第几条记录开始 224 | * 从0开始 225 | * 第1页 :http://127.0.0.1:8080/es/queryPage?startPage=0&pageSize=2 226 | * 第2页 :http://127.0.0.1:8080/es/queryPage?startPage=2&pageSize=2 227 | * @param pageSize 每页大小 228 | * @return 229 | */ 230 | @RequestMapping("/queryPage") 231 | public String queryPage(String startPage, String pageSize) { 232 | if (StringUtils.isNotBlank(startPage) && StringUtils.isNotBlank(pageSize)) { 233 | BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); 234 | boolQuery.must(QueryBuilders.rangeQuery("date").from("2018-04-25T08:33:44.840Z") 235 | .to("2019-04-25T10:03:08.081Z")); 236 | EsPage list = ElasticsearchUtil.searchDataPage(indexName, esType, Integer.parseInt(startPage), Integer.parseInt(pageSize), boolQuery, null, null, null); 237 | return JSONObject.toJSONString(list); 238 | } else { 239 | return "startPage或者pageSize缺失"; 240 | } 241 | } 242 | } -------------------------------------------------------------------------------- /src/main/java/cn/thislx/springbootes/SpringbootEsApplication.java: -------------------------------------------------------------------------------- 1 | package cn.thislx.springbootes; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SpringbootEsApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SpringbootEsApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/cn/thislx/springbootes/bean/EsModel.java: -------------------------------------------------------------------------------- 1 | package cn.thislx.springbootes.bean; 2 | 3 | import lombok.Data; 4 | import lombok.NoArgsConstructor; 5 | import lombok.ToString; 6 | 7 | import java.util.Date; 8 | 9 | /** 10 | * @Author: LX 11 | * @Description: 12 | * @Date: Created in 11:24 2018/11/6 13 | * @Modified by: 14 | */ 15 | @Data 16 | @ToString 17 | @NoArgsConstructor 18 | public class EsModel { 19 | 20 | private String id; 21 | 22 | private String name; 23 | 24 | private int age; 25 | 26 | private Date date; 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/cn/thislx/springbootes/bean/EsPage.java: -------------------------------------------------------------------------------- 1 | package cn.thislx.springbootes.bean; 2 | 3 | import lombok.Data; 4 | import lombok.ToString; 5 | 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | /** 10 | * @Author: LX 11 | * @Description: 12 | * @Date: Created in 11:23 2018/11/6 13 | * @Modified by: 14 | */ 15 | @Data 16 | @ToString 17 | public class EsPage { 18 | 19 | /** 20 | * 当前页 21 | */ 22 | private int currentPage; 23 | /** 24 | * 每页显示多少条 25 | */ 26 | private int pageSize; 27 | 28 | /** 29 | * 总记录数 30 | */ 31 | private int recordCount; 32 | /** 33 | * 本页的数据列表 34 | */ 35 | private List> recordList; 36 | 37 | /** 38 | * 总页数 39 | */ 40 | private int pageCount; 41 | /** 42 | * 页码列表的开始索引(包含) 43 | */ 44 | private int beginPageIndex; 45 | /** 46 | * 页码列表的结束索引(包含) 47 | */ 48 | private int endPageIndex; 49 | 50 | /** 51 | * 只接受前4个必要的属性,会自动的计算出其他3个属性的值 52 | * 53 | * @param currentPage 54 | * @param pageSize 55 | * @param recordCount 56 | * @param recordList 57 | */ 58 | public EsPage(int currentPage, int pageSize, int recordCount, List> recordList) { 59 | this.currentPage = currentPage; 60 | this.pageSize = pageSize; 61 | this.recordCount = recordCount; 62 | this.recordList = recordList; 63 | 64 | // 计算总页码 65 | pageCount = (recordCount + pageSize - 1) / pageSize; 66 | 67 | // 计算 beginPageIndex 和 endPageIndex 68 | // >> 总页数不多于10页,则全部显示 69 | if (pageCount <= 10) { 70 | beginPageIndex = 1; 71 | endPageIndex = pageCount; 72 | } 73 | // 总页数多于10页,则显示当前页附近的共10个页码 74 | else { 75 | // 当前页附近的共10个页码(前4个 + 当前页 + 后5个) 76 | beginPageIndex = currentPage - 4; 77 | endPageIndex = currentPage + 5; 78 | // 当前面的页码不足4个时,则显示前10个页码 79 | if (beginPageIndex < 1) { 80 | beginPageIndex = 1; 81 | endPageIndex = 10; 82 | } 83 | // 当后面的页码不足5个时,则显示后10个页码 84 | if (endPageIndex > pageCount) { 85 | endPageIndex = pageCount; 86 | beginPageIndex = pageCount - 10 + 1; 87 | } 88 | } 89 | } 90 | } -------------------------------------------------------------------------------- /src/main/java/cn/thislx/springbootes/config/ElasticsearchConfig.java: -------------------------------------------------------------------------------- 1 | package cn.thislx.springbootes.config; 2 | 3 | import org.elasticsearch.client.transport.TransportClient; 4 | import org.elasticsearch.common.settings.Settings; 5 | import org.elasticsearch.common.transport.TransportAddress; 6 | import org.elasticsearch.transport.client.PreBuiltTransportClient; 7 | import org.slf4j.Logger; 8 | import org.slf4j.LoggerFactory; 9 | import org.springframework.beans.factory.annotation.Value; 10 | import org.springframework.context.annotation.Bean; 11 | import org.springframework.context.annotation.Configuration; 12 | 13 | import java.net.InetAddress; 14 | 15 | /** 16 | * @Configuration用于定义配置类,可替换xml配置文件 17 | */ 18 | @Configuration 19 | public class ElasticsearchConfig { 20 | 21 | private static final Logger LOGGER = LoggerFactory.getLogger(ElasticsearchConfig.class); 22 | 23 | /** 24 | * elk集群地址 25 | */ 26 | @Value("${elasticsearch.ip}") 27 | private String hostName; 28 | 29 | /** 30 | * 端口 31 | */ 32 | @Value("${elasticsearch.port}") 33 | private String port; 34 | 35 | /** 36 | * 集群名称 37 | */ 38 | @Value("${elasticsearch.cluster.name}") 39 | private String clusterName; 40 | 41 | /** 42 | * 连接池 43 | */ 44 | @Value("${elasticsearch.pool}") 45 | private String poolSize; 46 | 47 | /** 48 | * Bean name default 函数名字 49 | * 50 | * @return 51 | */ 52 | @Bean(name = "transportClient") 53 | public TransportClient transportClient() { 54 | LOGGER.info("Elasticsearch初始化开始。。。。。"); 55 | TransportClient transportClient = null; 56 | try { 57 | // 配置信息 58 | Settings esSetting = Settings.builder() 59 | .put("cluster.name", clusterName) //集群名字 60 | .put("client.transport.sniff", true)//增加嗅探机制,找到ES集群 61 | .put("thread_pool.search.size", Integer.parseInt(poolSize))//增加线程池个数,暂时设为5 62 | .build(); 63 | //配置信息Settings自定义 64 | transportClient = new PreBuiltTransportClient(esSetting); 65 | TransportAddress transportAddress = new TransportAddress(InetAddress.getByName(hostName), Integer.valueOf(port)); 66 | transportClient.addTransportAddresses(transportAddress); 67 | } catch (Exception e) { 68 | LOGGER.error("elasticsearch TransportClient create error!!", e); 69 | } 70 | return transportClient; 71 | } 72 | 73 | } -------------------------------------------------------------------------------- /src/main/java/cn/thislx/springbootes/utils/ElasticsearchUtil.java: -------------------------------------------------------------------------------- 1 | package cn.thislx.springbootes.utils; 2 | 3 | import cn.thislx.springbootes.bean.EsPage; 4 | import com.alibaba.fastjson.JSONObject; 5 | import org.apache.commons.lang3.StringUtils; 6 | import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; 7 | import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse; 8 | import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest; 9 | import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse; 10 | import org.elasticsearch.action.delete.DeleteResponse; 11 | import org.elasticsearch.action.get.GetRequestBuilder; 12 | import org.elasticsearch.action.get.GetResponse; 13 | import org.elasticsearch.action.index.IndexResponse; 14 | import org.elasticsearch.action.search.SearchRequestBuilder; 15 | import org.elasticsearch.action.search.SearchResponse; 16 | import org.elasticsearch.action.search.SearchType; 17 | import org.elasticsearch.action.update.UpdateRequest; 18 | import org.elasticsearch.client.transport.TransportClient; 19 | import org.elasticsearch.common.text.Text; 20 | import org.elasticsearch.index.query.QueryBuilder; 21 | import org.elasticsearch.search.SearchHit; 22 | import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; 23 | import org.elasticsearch.search.sort.SortOrder; 24 | import org.slf4j.Logger; 25 | import org.slf4j.LoggerFactory; 26 | import org.springframework.beans.factory.annotation.Autowired; 27 | import org.springframework.stereotype.Component; 28 | 29 | import javax.annotation.PostConstruct; 30 | import java.util.ArrayList; 31 | import java.util.List; 32 | import java.util.Map; 33 | import java.util.UUID; 34 | 35 | /** 36 | * @Author: LX 37 | * @Description: 38 | * @Date: Created in 11:21 2018/11/6 39 | * @Modified by: 40 | */ 41 | @Component 42 | public class ElasticsearchUtil { 43 | 44 | private static final Logger LOGGER = LoggerFactory.getLogger(ElasticsearchUtil.class); 45 | 46 | @Autowired 47 | private TransportClient transportClient; 48 | 49 | private static TransportClient client; 50 | 51 | /** 52 | * @PostContruct是spring框架的注解 spring容器初始化的时候执行该方法 53 | */ 54 | @PostConstruct 55 | public void init() { 56 | client = this.transportClient; 57 | } 58 | 59 | /** 60 | * 创建索引 61 | * 62 | * @param index 63 | * @return 64 | */ 65 | public static boolean createIndex(String index) { 66 | if (!isIndexExist(index)) { 67 | LOGGER.info("Index is not exits!"); 68 | } 69 | CreateIndexResponse indexresponse = client.admin().indices().prepareCreate(index).execute().actionGet(); 70 | LOGGER.info("执行建立成功?" + indexresponse.isAcknowledged()); 71 | return indexresponse.isAcknowledged(); 72 | } 73 | 74 | /** 75 | * 删除索引 76 | * 77 | * @param index 78 | * @return 79 | */ 80 | public static boolean deleteIndex(String index) { 81 | if (!isIndexExist(index)) { 82 | LOGGER.info("Index is not exits!"); 83 | } 84 | DeleteIndexResponse dResponse = client.admin().indices().prepareDelete(index).execute().actionGet(); 85 | if (dResponse.isAcknowledged()) { 86 | LOGGER.info("delete index " + index + " successfully!"); 87 | } else { 88 | LOGGER.info("Fail to delete index " + index); 89 | } 90 | return dResponse.isAcknowledged(); 91 | } 92 | 93 | /** 94 | * 判断索引是否存在 95 | * 96 | * @param index 97 | * @return 98 | */ 99 | public static boolean isIndexExist(String index) { 100 | IndicesExistsResponse inExistsResponse = client.admin().indices().exists(new IndicesExistsRequest(index)).actionGet(); 101 | if (inExistsResponse.isExists()) { 102 | LOGGER.info("Index [" + index + "] is exist!"); 103 | } else { 104 | LOGGER.info("Index [" + index + "] is not exist!"); 105 | } 106 | return inExistsResponse.isExists(); 107 | } 108 | 109 | /** 110 | * @Author: LX 111 | * @Description: 判断inde下指定type是否存在 112 | * @Date: 2018/11/6 14:46 113 | * @Modified by: 114 | */ 115 | public boolean isTypeExist(String index, String type) { 116 | return isIndexExist(index) 117 | ? client.admin().indices().prepareTypesExists(index).setTypes(type).execute().actionGet().isExists() 118 | : false; 119 | } 120 | 121 | /** 122 | * 数据添加,正定ID 123 | * 124 | * @param jsonObject 要增加的数据 125 | * @param index 索引,类似数据库 126 | * @param type 类型,类似表 127 | * @param id 数据ID 128 | * @return 129 | */ 130 | public static String addData(JSONObject jsonObject, String index, String type, String id) { 131 | IndexResponse response = client.prepareIndex(index, type, id).setSource(jsonObject).get(); 132 | LOGGER.info("addData response status:{},id:{}", response.status().getStatus(), response.getId()); 133 | return response.getId(); 134 | } 135 | 136 | /** 137 | * 数据添加 138 | * 139 | * @param jsonObject 要增加的数据 140 | * @param index 索引,类似数据库 141 | * @param type 类型,类似表 142 | * @return 143 | */ 144 | public static String addData(JSONObject jsonObject, String index, String type) { 145 | return addData(jsonObject, index, type, UUID.randomUUID().toString().replaceAll("-", "").toUpperCase()); 146 | } 147 | 148 | /** 149 | * 通过ID删除数据 150 | * 151 | * @param index 索引,类似数据库 152 | * @param type 类型,类似表 153 | * @param id 数据ID 154 | */ 155 | public static void deleteDataById(String index, String type, String id) { 156 | 157 | DeleteResponse response = client.prepareDelete(index, type, id).execute().actionGet(); 158 | 159 | LOGGER.info("deleteDataById response status:{},id:{}", response.status().getStatus(), response.getId()); 160 | } 161 | 162 | /** 163 | * 通过ID 更新数据 164 | * 165 | * @param jsonObject 要增加的数据 166 | * @param index 索引,类似数据库 167 | * @param type 类型,类似表 168 | * @param id 数据ID 169 | * @return 170 | */ 171 | public static void updateDataById(JSONObject jsonObject, String index, String type, String id) { 172 | 173 | UpdateRequest updateRequest = new UpdateRequest(); 174 | 175 | updateRequest.index(index).type(type).id(id).doc(jsonObject); 176 | 177 | client.update(updateRequest); 178 | 179 | } 180 | 181 | /** 182 | * 通过ID获取数据 183 | * 184 | * @param index 索引,类似数据库 185 | * @param type 类型,类似表 186 | * @param id 数据ID 187 | * @param fields 需要显示的字段,逗号分隔(缺省为全部字段) 188 | * @return 189 | */ 190 | public static Map searchDataById(String index, String type, String id, String fields) { 191 | 192 | GetRequestBuilder getRequestBuilder = client.prepareGet(index, type, id); 193 | 194 | if (StringUtils.isNotEmpty(fields)) { 195 | getRequestBuilder.setFetchSource(fields.split(","), null); 196 | } 197 | 198 | GetResponse getResponse = getRequestBuilder.execute().actionGet(); 199 | 200 | return getResponse.getSource(); 201 | } 202 | 203 | 204 | /** 205 | * 使用分词查询,并分页 206 | * 207 | * @param index 索引名称 208 | * @param type 类型名称,可传入多个type逗号分隔 209 | * @param startPage 当前页 210 | * @param pageSize 每页显示条数 211 | * @param query 查询条件 212 | * @param fields 需要显示的字段,逗号分隔(缺省为全部字段) 213 | * @param sortField 排序字段 214 | * @param highlightField 高亮字段 215 | * @return 216 | */ 217 | public static EsPage searchDataPage(String index, String type, int startPage, int pageSize, QueryBuilder query, String fields, String sortField, String highlightField) { 218 | SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index); 219 | if (StringUtils.isNotEmpty(type)) { 220 | searchRequestBuilder.setTypes(type.split(",")); 221 | } 222 | searchRequestBuilder.setSearchType(SearchType.QUERY_THEN_FETCH); 223 | 224 | // 需要显示的字段,逗号分隔(缺省为全部字段) 225 | if (StringUtils.isNotEmpty(fields)) { 226 | searchRequestBuilder.setFetchSource(fields.split(","), null); 227 | } 228 | 229 | //排序字段 230 | if (StringUtils.isNotEmpty(sortField)) { 231 | searchRequestBuilder.addSort(sortField, SortOrder.DESC); 232 | } 233 | 234 | // 高亮(xxx=111,aaa=222) 235 | if (StringUtils.isNotEmpty(highlightField)) { 236 | HighlightBuilder highlightBuilder = new HighlightBuilder(); 237 | 238 | //highlightBuilder.preTags("");//设置前缀 239 | //highlightBuilder.postTags("");//设置后缀 240 | 241 | // 设置高亮字段 242 | highlightBuilder.field(highlightField); 243 | searchRequestBuilder.highlighter(highlightBuilder); 244 | } 245 | 246 | //searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery()); 247 | searchRequestBuilder.setQuery(query); 248 | 249 | // 分页应用 250 | searchRequestBuilder.setFrom(startPage).setSize(pageSize); 251 | 252 | // 设置是否按查询匹配度排序 253 | searchRequestBuilder.setExplain(true); 254 | 255 | //打印的内容 可以在 Elasticsearch head 和 Kibana 上执行查询 256 | LOGGER.info("\n{}", searchRequestBuilder); 257 | 258 | // 执行搜索,返回搜索响应信息 259 | SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); 260 | 261 | long totalHits = searchResponse.getHits().totalHits; 262 | long length = searchResponse.getHits().getHits().length; 263 | 264 | LOGGER.debug("共查询到[{}]条数据,处理数据条数[{}]", totalHits, length); 265 | 266 | if (searchResponse.status().getStatus() == 200) { 267 | // 解析对象 268 | List> sourceList = setSearchResponse(searchResponse, highlightField); 269 | 270 | return new EsPage(startPage, pageSize, (int) totalHits, sourceList); 271 | } 272 | 273 | return null; 274 | 275 | } 276 | 277 | 278 | /** 279 | * 使用分词查询 280 | * 281 | * @param index 索引名称 282 | * @param type 类型名称,可传入多个type逗号分隔 283 | * @param query 查询条件 284 | * @param size 文档大小限制 285 | * @param fields 需要显示的字段,逗号分隔(缺省为全部字段) 286 | * @param sortField 排序字段 287 | * @param highlightField 高亮字段 288 | * @return 289 | */ 290 | public static List> searchListData( 291 | String index, String type, QueryBuilder query, Integer size, 292 | String fields, String sortField, String highlightField) { 293 | 294 | SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index); 295 | if (StringUtils.isNotEmpty(type)) { 296 | searchRequestBuilder.setTypes(type.split(",")); 297 | } 298 | 299 | if (StringUtils.isNotEmpty(highlightField)) { 300 | HighlightBuilder highlightBuilder = new HighlightBuilder(); 301 | // 设置高亮字段 302 | highlightBuilder.field(highlightField); 303 | searchRequestBuilder.highlighter(highlightBuilder); 304 | } 305 | 306 | searchRequestBuilder.setQuery(query); 307 | 308 | if (StringUtils.isNotEmpty(fields)) { 309 | searchRequestBuilder.setFetchSource(fields.split(","), null); 310 | } 311 | searchRequestBuilder.setFetchSource(true); 312 | 313 | if (StringUtils.isNotEmpty(sortField)) { 314 | searchRequestBuilder.addSort(sortField, SortOrder.DESC); 315 | } 316 | 317 | if (size != null && size > 0) { 318 | searchRequestBuilder.setSize(size); 319 | } 320 | 321 | //打印的内容 可以在 Elasticsearch head 和 Kibana 上执行查询 322 | LOGGER.info("\n{}", searchRequestBuilder); 323 | 324 | SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); 325 | 326 | long totalHits = searchResponse.getHits().totalHits; 327 | long length = searchResponse.getHits().getHits().length; 328 | 329 | LOGGER.info("共查询到[{}]条数据,处理数据条数[{}]", totalHits, length); 330 | 331 | if (searchResponse.status().getStatus() == 200) { 332 | // 解析对象 333 | return setSearchResponse(searchResponse, highlightField); 334 | } 335 | return null; 336 | 337 | } 338 | 339 | 340 | /** 341 | * 高亮结果集 特殊处理 342 | * 343 | * @param searchResponse 344 | * @param highlightField 345 | */ 346 | private static List> setSearchResponse(SearchResponse searchResponse, String highlightField) { 347 | List> sourceList = new ArrayList>(); 348 | StringBuffer stringBuffer = new StringBuffer(); 349 | 350 | for (SearchHit searchHit : searchResponse.getHits().getHits()) { 351 | searchHit.getSourceAsMap().put("id", searchHit.getId()); 352 | 353 | if (StringUtils.isNotEmpty(highlightField)) { 354 | 355 | System.out.println("遍历 高亮结果集,覆盖 正常结果集" + searchHit.getSourceAsMap()); 356 | Text[] text = searchHit.getHighlightFields().get(highlightField).getFragments(); 357 | 358 | if (text != null) { 359 | for (Text str : text) { 360 | stringBuffer.append(str.string()); 361 | } 362 | //遍历 高亮结果集,覆盖 正常结果集 363 | searchHit.getSourceAsMap().put(highlightField, stringBuffer.toString()); 364 | } 365 | } 366 | sourceList.add(searchHit.getSourceAsMap()); 367 | } 368 | 369 | return sourceList; 370 | } 371 | 372 | } -------------------------------------------------------------------------------- /src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | # Elasticsearch 2 | # 9200端口是用来让HTTP REST API来访问ElasticSearch,而9300端口是传输层监听的默认端口 3 | elasticsearch.ip=192.168.30.128 4 | elasticsearch.port=9300 5 | elasticsearch.pool=5 6 | elasticsearch.cluster.name=my-application 7 | 8 | server.port=8181 -------------------------------------------------------------------------------- /src/test/java/cn/thislx/springbootes/SpringbootEsApplicationTests.java: -------------------------------------------------------------------------------- 1 | package cn.thislx.springbootes; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.boot.test.context.SpringBootTest; 6 | import org.springframework.test.context.junit4.SpringRunner; 7 | 8 | @RunWith(SpringRunner.class) 9 | @SpringBootTest 10 | public class SpringbootEsApplicationTests { 11 | 12 | @Test 13 | public void contextLoads() { 14 | } 15 | 16 | } 17 | --------------------------------------------------------------------------------