diff --git a/EaseSearch/.gitignore b/EaseSearch/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..549e00a2a96fa9d7c5dbc9859664a78d980158c2 --- /dev/null +++ b/EaseSearch/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/EaseSearch/.mvn/wrapper/maven-wrapper.jar b/EaseSearch/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..c1dd12f17644411d6e840bd5a10c6ecda0175f18 Binary files /dev/null and b/EaseSearch/.mvn/wrapper/maven-wrapper.jar differ diff --git a/EaseSearch/.mvn/wrapper/maven-wrapper.properties b/EaseSearch/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000000000000000000000000000000000000..22f219d25e06dee5740007ff63eac207c04591fc --- /dev/null +++ b/EaseSearch/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.5/apache-maven-3.8.5-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar diff --git a/EaseSearch/Dockerfile b/EaseSearch/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..bab5c7d50deb0fdd7e5187d088d34a61275f429b --- /dev/null +++ b/EaseSearch/Dockerfile @@ -0,0 +1,20 @@ +FROM node + +ENV LANG C.UTF-8 +ENV LC_ALL C.UTF-8 +ENV LANGUAGE C.UTF-8 +ENV NODE_OPTIONS --max-old-space-size=8192 + +RUN mkdir -p /EaseSearch \ + && apt update \ + && apt-get install -y openjdk-17-jdk + +WORKDIR /EaseSearch +COPY . /EaseSearch +RUN chmod 777 -R ./* \ + && ./mvnw clean install package -Dmaven.test.skip \ + && cd ./target/classes \ + && chmod 777 -R script \ + && cd ../ +EXPOSE 8080 +CMD java -jar ./target/EaseSearch-0.0.1-SNAPSHOT.jar diff --git a/EaseSearch/LICENSE b/EaseSearch/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..9e32cdef1625daed25cf365c865f01050877cff3 --- /dev/null +++ b/EaseSearch/LICENSE @@ -0,0 +1,127 @@ + 木兰宽松许可证, 第2版 + + 木兰宽松许可证, 第2版 + 2020年1月 http://license.coscl.org.cn/MulanPSL2 + + + 您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: + + 0. 定义 + + “软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 + + “贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 + + “贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 + + “法人实体”是指提交贡献的机构及其“关联实体”。 + + “关联实体”是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 + + 1. 授予版权许可 + + 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 + + 2. 授予专利许可 + + 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 + + 3. 无商标许可 + + “本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 + + 4. 分发限制 + + 您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 + + 5. 免责声明与责任限制 + + “软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 + + 6. 语言 + “本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。 + + 条款结束 + + 如何将木兰宽松许可证,第2版,应用到您的软件 + + 如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: + + 1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; + + 2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; + + 3, 请将如下声明文本放入每个源文件的头部注释中。 + + Copyright (c) [Year] [name of copyright holder] + [Software Name] is licensed under Mulan PSL v2. + You can use this software according to the terms and conditions of the Mulan PSL v2. + You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 + THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + See the Mulan PSL v2 for more details. + + + Mulan Permissive Software License,Version 2 + + Mulan Permissive Software License,Version 2 (Mulan PSL v2) + January 2020 http://license.coscl.org.cn/MulanPSL2 + + Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions: + + 0. Definition + + Software means the program and related documents which are licensed under this License and comprise all Contribution(s). + + Contribution means the copyrightable work licensed by a particular Contributor under this License. + + Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License. + + Legal Entity means the entity making a Contribution and all its Affiliates. + + Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity. + + 1. Grant of Copyright License + + Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not. + + 2. Grant of Patent License + + Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken. + + 3. No Trademark License + + No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in Section 4. + + 4. Distribution Restriction + + You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software. + + 5. Disclaimer of Warranty and Limitation of Liability + + THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + 6. Language + + THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL. + + END OF THE TERMS AND CONDITIONS + + How to Apply the Mulan Permissive Software License,Version 2 (Mulan PSL v2) to Your Software + + To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps: + + i Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner; + + ii Create a file named “LICENSE” which contains the whole context of this License in the first directory of your software package; + + iii Attach the statement to the appropriate annotated syntax at the beginning of each source file. + + + Copyright (c) [Year] [name of copyright holder] + [Software Name] is licensed under Mulan PSL v2. + You can use this software according to the terms and conditions of the Mulan PSL v2. + You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 + THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + See the Mulan PSL v2 for more details. diff --git a/EaseSearch/README.md b/EaseSearch/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/EaseSearch/mvnw b/EaseSearch/mvnw new file mode 100644 index 0000000000000000000000000000000000000000..8a8fb2282df5b8f7263470a5a2dc0e196f35f35f --- /dev/null +++ b/EaseSearch/mvnw @@ -0,0 +1,316 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/EaseSearch/mvnw.cmd b/EaseSearch/mvnw.cmd new file mode 100644 index 0000000000000000000000000000000000000000..1d8ab018eaf11d9b3a4a90e7818ace373dfbb380 --- /dev/null +++ b/EaseSearch/mvnw.cmd @@ -0,0 +1,188 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/EaseSearch/pom.xml b/EaseSearch/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..5e62676bec2250b41849810bd4b19cecf3b2fc58 --- /dev/null +++ b/EaseSearch/pom.xml @@ -0,0 +1,118 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.1 + + + + com.search + EaseSearch + 0.0.1-SNAPSHOT + EaseSearch + Demo project for Spring Boot + + 17 + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.boot + spring-boot-starter-web + + + + + + + + + + org.elasticsearch + elasticsearch + 7.6.2 + + + + org.elasticsearch.client + elasticsearch-rest-high-level-client + 7.6.2 + + + + com.alibaba + fastjson + 2.0.7 + + + + org.projectlombok + lombok + true + + + + commons-io + commons-io + 2.6 + + + + org.commonmark + commonmark + 0.18.1 + + + org.commonmark + commonmark-ext-gfm-tables + 0.18.1 + + + + org.jsoup + jsoup + 1.13.1 + + + + + org.yaml + snakeyaml + 1.26 + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + 18 + 18 + + + + + + diff --git a/EaseSearch/src/main/java/META-INF/MANIFEST.MF b/EaseSearch/src/main/java/META-INF/MANIFEST.MF new file mode 100644 index 0000000000000000000000000000000000000000..08969652614b95f50ae14b1a4a5563459300568c --- /dev/null +++ b/EaseSearch/src/main/java/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: com.search.docsearch.DocSearchApplication + diff --git a/EaseSearch/src/main/java/com/search/docsearch/DocSearchApplication.java b/EaseSearch/src/main/java/com/search/docsearch/DocSearchApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..7df7e2e960af47f47870bc23b25d13cf749833a5 --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/DocSearchApplication.java @@ -0,0 +1,15 @@ +package com.search.docsearch; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; + +@SpringBootApplication +@EnableScheduling +public class DocSearchApplication { + + public static void main(String[] args) { + SpringApplication.run(DocSearchApplication.class, args); + } + +} diff --git a/EaseSearch/src/main/java/com/search/docsearch/config/ElasticSearchConfig.java b/EaseSearch/src/main/java/com/search/docsearch/config/ElasticSearchConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..6e93f0c4da30f827900a34d60a5e85133ad769c8 --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/config/ElasticSearchConfig.java @@ -0,0 +1,80 @@ +package com.search.docsearch.config; + +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; +import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy; +import org.apache.http.ssl.SSLContextBuilder; +import org.apache.http.ssl.TrustStrategy; +import org.elasticsearch.client.RestClient; +import org.elasticsearch.client.RestClientBuilder; +import org.elasticsearch.client.RestHighLevelClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.net.ssl.*; + +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +@Configuration +@EnableConfigurationProperties(ElasticsearchProperties.class) +@Slf4j +public class ElasticSearchConfig { + + @Value("${elasticsearch.username}") + private String userName; + + @Value("${elasticsearch.password}") + private String password; + + @Value("${elasticsearch.host}") + private String host; + + @Value("${elasticsearch.port}") + private int port; + + + @Bean(destroyMethod = "close") + public RestHighLevelClient restHighLevelClient() { + + RestHighLevelClient restClient = null; + try { + final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); + credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password)); + SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { + @Override + public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { + return true; + } + }).build(); + SSLIOSessionStrategy sessionStrategy = new SSLIOSessionStrategy(sslContext, NoopHostnameVerifier.INSTANCE); + restClient = new RestHighLevelClient( + RestClient.builder(new HttpHost(host, port, "https")).setHttpClientConfigCallback( + new RestClientBuilder.HttpClientConfigCallback() { + @Override + public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) { + httpAsyncClientBuilder.disableAuthCaching(); + httpAsyncClientBuilder.setSSLStrategy(sessionStrategy); + httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider); + return httpAsyncClientBuilder; + } + } + ) + ); + } catch (Exception e) { + log.error("elasticsearch TransportClient create error!!", e); + } + return restClient; + + + } +} diff --git a/EaseSearch/src/main/java/com/search/docsearch/config/MySystem.java b/EaseSearch/src/main/java/com/search/docsearch/config/MySystem.java new file mode 100644 index 0000000000000000000000000000000000000000..1af2b8e7907eff210836a99827e67653e0686d5f --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/config/MySystem.java @@ -0,0 +1,22 @@ +package com.search.docsearch.config; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = true) +public class MySystem { + + public String system; + public String docsVersion; + public String index; + public String mappingPath; + public String basePath; + public String initDoc; + public String updateDoc; + +} diff --git a/EaseSearch/src/main/java/com/search/docsearch/config/SystemConfig.java b/EaseSearch/src/main/java/com/search/docsearch/config/SystemConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..0dc405f6c50a6e12d6a44a9f23eb3b32770c47a2 --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/config/SystemConfig.java @@ -0,0 +1,52 @@ +package com.search.docsearch.config; + + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Locale; + +@Configuration +@EnableConfigurationProperties(ElasticsearchProperties.class) +@Slf4j +public class SystemConfig { + + @Value("${system}") + private String system; + @Value("${docsversion}") + private String docsVersion; + @Value("${dep}") + private String dep; + + + public static final String MAPPINGPATH = "/EaseSearch/target/classes/mapping/mapping.json"; + + public static final String BASEPATH = "/usr/local/docs/target/"; + + @Bean + public MySystem setConfig() { + system = system.toLowerCase(Locale.ROOT); + dep = dep.toLowerCase(Locale.ROOT); + MySystem mySystem = new MySystem(); + + mySystem.setSystem(system); + + if (dep.equals("test")) { + mySystem.setIndex(system + "_articles_test"); + } else { + mySystem.setIndex(system + "_articles"); + } + + mySystem.setDocsVersion(docsVersion); + mySystem.setMappingPath(MAPPINGPATH); + mySystem.setBasePath(BASEPATH); + + mySystem.setInitDoc("/EaseSearch/target/classes/script/" + system + "/initDoc.sh"); + mySystem.setUpdateDoc("/EaseSearch/target/classes/script/" + system + "/updateDoc.sh"); + return mySystem; + } +} diff --git a/EaseSearch/src/main/java/com/search/docsearch/config/TipSystem.java b/EaseSearch/src/main/java/com/search/docsearch/config/TipSystem.java new file mode 100644 index 0000000000000000000000000000000000000000..7cdb771e66c172be86954d50c1a2d6c3c8143b14 --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/config/TipSystem.java @@ -0,0 +1,22 @@ +package com.search.docsearch.config; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = true) +public class TipSystem { + + public String system; + public String docsVersion; + public String index; + public String mappingPath; + public String basePath; + public String initDoc; + public String updateDoc; + +} diff --git a/EaseSearch/src/main/java/com/search/docsearch/config/TipSystemConfig.java b/EaseSearch/src/main/java/com/search/docsearch/config/TipSystemConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..734eb40bfe32206cf8e7b917636575d94fd7a78b --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/config/TipSystemConfig.java @@ -0,0 +1,52 @@ +package com.search.docsearch.config; + + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Locale; + +@Configuration +@EnableConfigurationProperties(ElasticsearchProperties.class) +@Slf4j +public class TipSystemConfig { + + @Value("${system}") + private String system; + @Value("${docsversion}") + private String docsVersion; + @Value("${dep}") + private String dep; + + + public static final String TIPMAPPINGPATH = TipSystemConfig.class.getClassLoader().getResource("").getPath()+ "mapping/tips_mapping.json"; + + public static final String TIPBASEPATH = "/usr/local/docs/target/"; + + @Bean + public TipSystem setTipConfig() { + system = system.toLowerCase(Locale.ROOT); + dep = dep.toLowerCase(Locale.ROOT); + TipSystem tipSystem = new TipSystem(); + + tipSystem.setSystem(system); + + if (dep.equals("test")) { + tipSystem.setIndex(system + "_tips_test"); + } else { + tipSystem.setIndex(system + "_tips"); + } + + tipSystem.setDocsVersion(docsVersion); + tipSystem.setMappingPath(TIPMAPPINGPATH); + tipSystem.setBasePath(TIPBASEPATH); + + tipSystem.setInitDoc("/EaseSearch/target/classes/script/" + system + "/initDoc.sh"); + tipSystem.setUpdateDoc("/EaseSearch/target/classes/script/" + system + "/updateDoc.sh"); + return tipSystem; + } +} diff --git a/EaseSearch/src/main/java/com/search/docsearch/constant/Constants.java b/EaseSearch/src/main/java/com/search/docsearch/constant/Constants.java new file mode 100644 index 0000000000000000000000000000000000000000..2749e804ff94b39e166d81682602362be1d89258 --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/constant/Constants.java @@ -0,0 +1,8 @@ +package com.search.docsearch.constant; + +public class Constants { + public static final String BASEPATH = "/usr/local/docs/target/"; +} + + + diff --git a/EaseSearch/src/main/java/com/search/docsearch/controller/BeginFun.java b/EaseSearch/src/main/java/com/search/docsearch/controller/BeginFun.java new file mode 100644 index 0000000000000000000000000000000000000000..9e9534374fa7182295df8f88d9be9be54c2bdcb1 --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/controller/BeginFun.java @@ -0,0 +1,63 @@ +package com.search.docsearch.controller; + + +import com.search.docsearch.config.MySystem; +import com.search.docsearch.service.SearchService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +@Component +@Slf4j +@RestController +public class BeginFun implements ApplicationRunner { + @Autowired + public SearchService searchService; + @Autowired + @Qualifier("setConfig") + private MySystem s; + + + @Override + @PostMapping("begin") + public void run(ApplicationArguments args) throws IOException { + boolean success = false; + try { + log.info("===============开始拉取仓库资源================="); + ProcessBuilder pb = new ProcessBuilder(s.initDoc); + Process p = pb.start(); + BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); + String line = null; + while ((line = reader.readLine()) != null) + { + log.info(line); + if (line.contains("build complete in")) { + log.info("Static resource build successfully"); + success = true; + } + } + System.out.println("---"); + log.info("===============仓库资源拉取成功================="); + } catch (Exception e) { + log.error(e.getMessage()); + } + System.out.println("ddd"); + if (success) { + searchService.refreshDoc(); + } else { + log.info("初始化数据失败,查看日志!"); + } + + } + + +} diff --git a/EaseSearch/src/main/java/com/search/docsearch/controller/DivideController.java b/EaseSearch/src/main/java/com/search/docsearch/controller/DivideController.java new file mode 100644 index 0000000000000000000000000000000000000000..e905de88bf14e5043ab7f54aa17d74e6db406176 --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/controller/DivideController.java @@ -0,0 +1,75 @@ +package com.search.docsearch.controller; + + +import com.search.docsearch.entity.vo.SysResult; +import com.search.docsearch.service.DivideService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +@RestController +@Slf4j +@RequestMapping("/search/sort") +public class DivideController { + @Autowired + private DivideService divideService; + + + + @PostMapping("blog") + public SysResult DivideBLog(@RequestBody Map m){ + + try { + Map result = divideService.advancedSearch(m, "blog"); + if (result == null) { + return SysResult.fail("内容不存在", null); + } + return SysResult.ok("查询成功", result); + } catch (Exception e) { + e.printStackTrace(); + } + + + return SysResult.fail("查询失败", null); + } + + + @PostMapping("news") + public SysResult DivideNews(@RequestBody Map m){ + try { + Map result = divideService.advancedSearch(m, "news"); + if (result == null) { + return SysResult.fail("内容不存在", null); + } + return SysResult.ok("查询成功", result); + } catch (Exception e) { + e.printStackTrace(); + } + + + return SysResult.fail("查询失败", null); + } + + @PostMapping("showcase") + public SysResult DivideShowcase(@RequestBody Map m){ + try { + Map result = divideService.advancedSearch(m, "showcase"); + if (result == null) { + return SysResult.fail("内容不存在", null); + } + return SysResult.ok("查询成功", result); + } catch (Exception e) { + e.printStackTrace(); + } + + + return SysResult.fail("查询失败", null); + } + + +} diff --git a/EaseSearch/src/main/java/com/search/docsearch/controller/SearchController.java b/EaseSearch/src/main/java/com/search/docsearch/controller/SearchController.java new file mode 100644 index 0000000000000000000000000000000000000000..f770e94c34b1579003fe2e6ab0992e625dd6a28e --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/controller/SearchController.java @@ -0,0 +1,165 @@ +package com.search.docsearch.controller; + + +import com.search.docsearch.config.MySystem; +import com.search.docsearch.entity.vo.SearchCondition; +import com.search.docsearch.entity.vo.SearchTags; +import com.search.docsearch.entity.vo.SysResult; +import com.search.docsearch.service.SearchService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; + +@RestController +@Slf4j +@RequestMapping("/search") +public class SearchController { + + @Autowired + private SearchService searchService; + @Autowired + @Qualifier("setConfig") + private MySystem s; + + /** + * 查询文档 + * + * @param condition 封装查询条件 + * @return 搜索结果 + */ + @PostMapping("docs") + public SysResult searchDocByKeyword(@RequestBody SearchCondition condition) { + if (!StringUtils.hasText(condition.getKeyword())) { + return SysResult.fail("keyword must not null", null); + } +// condition.setKeyword(condition.getKeyword().replace("#", "")); + try { + Map result = searchService.searchByCondition(condition); + if (result == null) { + return SysResult.fail("内容不存在", null); + } + return SysResult.ok("查询成功", result); + } catch (Exception e) { + log.error(e.getMessage()); + e.printStackTrace(); + } + return SysResult.fail("查询失败", null); + } + + + @PostMapping("count") + public SysResult getCount(@RequestBody SearchCondition condition) { + try { + Map result = searchService.getCount(condition.getKeyword(), condition.getLang()); + if (result == null) { + return SysResult.fail("内容不存在", null); + } + return SysResult.ok("查询成功", result); + } catch (Exception e) { + log.error(e.getMessage()); + e.printStackTrace(); + } + return SysResult.fail("查询失败", null); + } + + @PostMapping("pop") + public SysResult getPop(String lang) { + try { + String[] result = null; + if (lang.equals("zh")) { + result = new String[] {"迁移", "docker", "mysql", "yum", "建设", "ssh", "生命周期", "虚拟化"}; + } else { + result = new String[] {"docker", "mysql", "yum", "openstack", "cla"}; + } + + return SysResult.ok("查询成功", result); + } catch (Exception e) { + log.error(e.getMessage()); + e.printStackTrace(); + } + return SysResult.fail("查询失败", null); + } + + + @PostMapping("sort") + public SysResult makeSort(@RequestBody Map m) { + + try { + Map result = searchService.advancedSearch(m); + if (result == null) { + return SysResult.fail("内容不存在", null); + } + return SysResult.ok("查询成功", result); + } catch (Exception e) { + e.printStackTrace(); + } + + + return SysResult.fail("查询失败", null); + } + + @PostMapping("tags") + public SysResult getTags(@RequestBody SearchTags searchTags) { + try { + Map result = searchService.getTags(searchTags); + if (result == null) { + return SysResult.fail("内容不存在", null); + } + return SysResult.ok("查询成功", result); + } catch (Exception e) { + e.printStackTrace(); + } + + + return SysResult.fail("查询失败", null); + } + + + /** + * 定时任务 + */ + @Scheduled(cron = "${scheduled.cron}") + public String scheduledTask() throws IOException { + boolean success = false; + Process process; + try { + log.info("===============开始更新仓库资源================="); + ProcessBuilder pb = new ProcessBuilder(s.updateDoc); + Process p = pb.start(); + BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); + String line = null; + while ((line = reader.readLine()) != null) + { + log.info(line); + if (line.contains("build complete in")) { + success = true; + } + } + log.info("===============仓库资源更新成功================="); + } catch (IOException e) { + log.error(e.getMessage()); + } + + if (success) { + searchService.refreshDoc(); + } else { + log.info("更新数据失败,查看日志"); + } + + //每天更新联想词库中的数据 +// searchService.refreshTip(); + + return "success"; + } +} diff --git a/EaseSearch/src/main/java/com/search/docsearch/entity/Article.java b/EaseSearch/src/main/java/com/search/docsearch/entity/Article.java new file mode 100644 index 0000000000000000000000000000000000000000..b3808686077c7e565d006696fa886384aaac78f4 --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/entity/Article.java @@ -0,0 +1,48 @@ +package com.search.docsearch.entity; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = true) +public class Article { + + private static final long serialVersionUID = 1L; + private String id; + /** + * 文件全路径 + */ + private String articleName; + /** + * 页面访问路径 + */ + private String path; + /** + * 文件内容 + */ + private String textContent; + /** + * 文件名称 + */ + private String title; + /** + * 文件类型 + */ + private String type; + + /** + * 语言 + */ + private String lang; + + /** + * 版本 + */ + private String version; + +} diff --git a/EaseSearch/src/main/java/com/search/docsearch/entity/vo/SearchCondition.java b/EaseSearch/src/main/java/com/search/docsearch/entity/vo/SearchCondition.java new file mode 100644 index 0000000000000000000000000000000000000000..f690c9f0da1b614497baef10623b6a406ab9a41a --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/entity/vo/SearchCondition.java @@ -0,0 +1,24 @@ +package com.search.docsearch.entity.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = true) +public class SearchCondition implements Serializable { + + @Serial + private static final long serialVersionUID = -969897369024720352L; + private String lang; + private int page = 1; + private int pageSize = 10; + private String keyword; + private String type; +} diff --git a/EaseSearch/src/main/java/com/search/docsearch/entity/vo/SearchTags.java b/EaseSearch/src/main/java/com/search/docsearch/entity/vo/SearchTags.java new file mode 100644 index 0000000000000000000000000000000000000000..ec0d7bb16ef5eb841a7b3320c7ee55900409e3d6 --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/entity/vo/SearchTags.java @@ -0,0 +1,26 @@ +package com.search.docsearch.entity.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Map; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = true) +public class SearchTags implements Serializable { + @Serial + private static final long serialVersionUID = -969897369024720352L; + private String lang; + private String category; + private String want; + private Map condition; + +} + + diff --git a/EaseSearch/src/main/java/com/search/docsearch/entity/vo/Suggest.java b/EaseSearch/src/main/java/com/search/docsearch/entity/vo/Suggest.java new file mode 100644 index 0000000000000000000000000000000000000000..fb041d8c07ea189a7442003c104b8af42a05c347 --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/entity/vo/Suggest.java @@ -0,0 +1,6 @@ +package com.search.docsearch.entity.vo; + +public class Suggest { + boolean trigger; + String newKeyword; +} diff --git a/EaseSearch/src/main/java/com/search/docsearch/entity/vo/SysResult.java b/EaseSearch/src/main/java/com/search/docsearch/entity/vo/SysResult.java new file mode 100644 index 0000000000000000000000000000000000000000..3a6ed676247156dc7110fab8c7314247d7eb3e3c --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/entity/vo/SysResult.java @@ -0,0 +1,55 @@ +package com.search.docsearch.entity.vo; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; + +@Data +@Accessors(chain = true) +public class SysResult implements Serializable { + + @Serial + private static final long serialVersionUID = 3208248423120492873L; + private Integer status; + private String msg; + private Object obj; + + public SysResult(Integer status, String msg, Object obj) { + this.status = status; + this.msg = msg; + this.obj = obj; + } + + public SysResult() { + } + + public SysResult(Throwable e) { + this.status = 201; + this.msg = e.getMessage(); + } + + //定义成功的静态方法 + public static SysResult ok(String msg, Object obj) { + return new SysResult(200, msg, obj); + } + + //表示定义成功的静态方法 + public static SysResult ok() { + return new SysResult(200, null, null); + } + + public static SysResult ok(Object data) { + return new SysResult(200, null, data); + } + + //定义一个失败的静态方法 + public static SysResult fail(String msg, Object data) { + return new SysResult(201, msg, data); + } + + public static SysResult fail() { + return new SysResult(201, null, null); + } +} diff --git a/EaseSearch/src/main/java/com/search/docsearch/service/DivideService.java b/EaseSearch/src/main/java/com/search/docsearch/service/DivideService.java new file mode 100644 index 0000000000000000000000000000000000000000..01d6cce483bc1a3b8d6172fb6d6127c81923c01a --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/service/DivideService.java @@ -0,0 +1,10 @@ +package com.search.docsearch.service; + +import java.util.Map; + +public interface DivideService { + + Map advancedSearch(Map search, String category) throws Exception; + + +} diff --git a/EaseSearch/src/main/java/com/search/docsearch/service/SearchService.java b/EaseSearch/src/main/java/com/search/docsearch/service/SearchService.java new file mode 100644 index 0000000000000000000000000000000000000000..413b7084394b0529cc8043ca0701c9ae7399d74c --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/service/SearchService.java @@ -0,0 +1,41 @@ +package com.search.docsearch.service; + +import com.search.docsearch.entity.vo.SearchCondition; +import com.search.docsearch.entity.vo.SearchTags; + +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public interface SearchService { + + + /** + * 根据索引名称和版本刷新数据 + * + */ + void refreshDoc() throws IOException; + + void refreshTip() throws IOException; + + + /** + * 根据条件搜索 + * + * @param condition 搜索条件 + * @return 符合条件记录 + * @throws IOException + */ + Map searchByCondition(SearchCondition condition) throws IOException; + + + Map getCount(String keyword, String lang) throws IOException; + + + Map advancedSearch(Map search) throws Exception; + + Map getTags(SearchTags searchTags) throws Exception; + + Set getSearchSuggest(Integer pageSize, String key); +} diff --git a/EaseSearch/src/main/java/com/search/docsearch/service/impl/DivideServiceImpl.java b/EaseSearch/src/main/java/com/search/docsearch/service/impl/DivideServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..27988f6e8f7024b2e40739332796df4f124f887d --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/service/impl/DivideServiceImpl.java @@ -0,0 +1,101 @@ +package com.search.docsearch.service.impl; + +import com.search.docsearch.config.MySystem; +import com.search.docsearch.service.DivideService; +import lombok.extern.slf4j.Slf4j; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.MatchQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.sort.SortOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +@Service +@Slf4j +public class DivideServiceImpl implements DivideService { + + @Autowired + @Qualifier("restHighLevelClient") + private RestHighLevelClient restHighLevelClient; + + @Autowired + @Qualifier("setConfig") + private MySystem s; + + + @Override + public Map advancedSearch(Map search, String category) throws Exception { + SearchRequest request = new SearchRequest(s.index); + SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.filter(QueryBuilders.termQuery("category" + ".keyword", category)); + + + int page = 1; + int pageSize = 10; + String keyword = ""; + + for (Map.Entry entry : search.entrySet()) { + if (entry.getKey().equals("page")) { + page = Integer.parseInt(entry.getValue()); + continue; + } + if (entry.getKey().equals("pageSize")) { + pageSize = Integer.parseInt(entry.getValue()); + continue; + } + if (entry.getKey().equals("keyword")) { + keyword = entry.getValue(); + continue; + } + + boolQueryBuilder.filter(QueryBuilders.termQuery(entry.getKey() + ".keyword", entry.getValue())); + } + + int startIndex = (page - 1) * pageSize; + + if (!keyword.equals("")) { + MatchQueryBuilder titleMP = QueryBuilders.matchQuery("title", keyword); + titleMP.boost(2); + MatchQueryBuilder textContentMP = QueryBuilders.matchQuery("textContent", keyword); + textContentMP.boost(1); + boolQueryBuilder.should(titleMP).should(textContentMP); + + boolQueryBuilder.minimumShouldMatch(1); + } + + sourceBuilder.from(startIndex).size(pageSize); + sourceBuilder.query(boolQueryBuilder); + + sourceBuilder.sort("date", SortOrder.DESC); + + request.source(sourceBuilder); + + + SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); + + Map result = new HashMap<>(); + List> data = new ArrayList<>(); + for (SearchHit hit : response.getHits().getHits()) { + Map map = hit.getSourceAsMap(); + + data.add(map); + } + result.put("page", page); + result.put("pageSize", pageSize); + result.put("count", response.getHits().getTotalHits().value); + result.put("records", data); + return result; + } +} diff --git a/EaseSearch/src/main/java/com/search/docsearch/service/impl/SearchServiceImpl.java b/EaseSearch/src/main/java/com/search/docsearch/service/impl/SearchServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..36d38c2db60fc74d1b350f10a3ce43697cdb71db --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/service/impl/SearchServiceImpl.java @@ -0,0 +1,450 @@ +package com.search.docsearch.service.impl; + +import com.search.docsearch.config.MySystem; +import com.search.docsearch.config.TipSystem; +import com.search.docsearch.entity.Article; +import com.search.docsearch.entity.vo.SearchCondition; +import com.search.docsearch.entity.vo.SearchTags; +import com.search.docsearch.entity.vo.Suggest; +import com.search.docsearch.service.SearchService; +import com.search.docsearch.utils.EulerParse; +import com.search.docsearch.utils.IdUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FileUtils; +import org.elasticsearch.action.bulk.BulkRequest; +import org.elasticsearch.action.bulk.BulkResponse; +import org.elasticsearch.action.index.IndexRequest; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.client.indices.CreateIndexRequest; +import org.elasticsearch.client.indices.GetIndexRequest; +import org.elasticsearch.common.unit.Fuzziness; +import org.elasticsearch.common.unit.TimeValue; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.index.query.*; +import org.elasticsearch.index.reindex.BulkByScrollResponse; +import org.elasticsearch.index.reindex.DeleteByQueryRequest; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.aggregations.AggregationBuilder; +import org.elasticsearch.search.aggregations.AggregationBuilders; +import org.elasticsearch.search.aggregations.BucketOrder; +import org.elasticsearch.search.aggregations.bucket.terms.ParsedTerms; +import org.elasticsearch.search.aggregations.bucket.terms.Terms; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; +import org.elasticsearch.search.fetch.subphase.highlight.HighlightField; +import org.elasticsearch.search.sort.ScoreSortBuilder; +import org.elasticsearch.search.sort.SortBuilder; +import org.elasticsearch.search.sort.SortOrder; +import org.elasticsearch.search.suggest.SuggestBuilder; +import org.elasticsearch.search.suggest.SuggestBuilders; +import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.*; + + +@Service +@Slf4j +public class SearchServiceImpl implements SearchService { + + @Autowired + @Qualifier("restHighLevelClient") + private RestHighLevelClient restHighLevelClient; + + @Autowired + @Qualifier("setConfig") + private MySystem s; + + @Autowired + @Qualifier("setTipConfig") + private TipSystem ts; + + + @Override + public void refreshDoc() throws IOException { + + GetIndexRequest request = new GetIndexRequest(s.index); + request.local(false); + request.humanReadable(true); + request.includeDefaults(false); + boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT); + if (!exists) { + CreateIndexRequest request1 = new CreateIndexRequest(s.index); + File mappingJson = FileUtils.getFile(s.mappingPath); + String mapping = FileUtils.readFileToString(mappingJson, StandardCharsets.UTF_8); + + request1.mapping(mapping, XContentType.JSON); + request1.setTimeout(TimeValue.timeValueMillis(1)); + + restHighLevelClient.indices().create(request1, RequestOptions.DEFAULT); + } + + File indexFile = new File(s.basePath); + if (!indexFile.exists()) { + log.error(String.format("%s 文件夹不存在", indexFile.getPath())); + log.error("服务器开小差了"); + return; + } + log.info("开始更新es文档"); + String lang = ""; + String deleteType = ""; + File[] typeDir; + File[] languageDir = indexFile.listFiles(); + assert languageDir != null; + for (File languageFile : languageDir) { + lang = languageFile.getName(); + typeDir = languageFile.listFiles(); + assert typeDir != null; + for (File typeFile : typeDir) { + if (typeFile.isDirectory()) { + BulkRequest bulkRequest = new BulkRequest(); + deleteType = typeFile.getName(); + + Collection listFiles = FileUtils.listFiles(typeFile, new String[]{"md", "html"}, true); + + for (File mdFile : listFiles) { + if (!mdFile.getName().startsWith("_")) { + try { + Map map = EulerParse.parse(lang, deleteType, mdFile); + if (map != null) { + IndexRequest indexRequest = new IndexRequest(s.index).id(IdUtil.getId()).source(map); + bulkRequest.add(indexRequest); + } + } catch (Exception e) { + log.info(mdFile.getPath()); + log.error(e.getMessage()); + } + } + } + log.info(deleteType + " have " + bulkRequest.requests().size()); + DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(s.index); + BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); + boolQueryBuilder.must(new TermQueryBuilder("lang.keyword", lang)); + boolQueryBuilder.must(new TermQueryBuilder("deleteType.keyword", deleteType)); + deleteByQueryRequest.setQuery(boolQueryBuilder); + BulkByScrollResponse r = restHighLevelClient.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT); + if (bulkRequest.requests().size() > 0) { + BulkResponse q = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT); + log.info("wrong ? " + q.hasFailures()); + log.info(lang + "/" + deleteType + "更新成功"); + } + + } + } + } + log.info("所有文档更新成功"); + } + + + @Override + public void refreshTip() throws IOException { + GetIndexRequest request = new GetIndexRequest(ts.index); + request.local(false); + request.humanReadable(true); + request.includeDefaults(false); + boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT); + +// 如果索引库不存在,按照mapping构建索引库 + if (!exists) { + CreateIndexRequest request1 = new CreateIndexRequest(ts.index); + File mappingJson = FileUtils.getFile(ts.mappingPath); + String mapping = FileUtils.readFileToString(mappingJson, StandardCharsets.UTF_8); + + request1.mapping(mapping, XContentType.JSON); + request1.setTimeout(TimeValue.timeValueMillis(1)); + + restHighLevelClient.indices().create(request1, RequestOptions.DEFAULT); + } + + //TODO:将联想词汇录入词库 + + } + + + @Override + public Map searchByCondition(SearchCondition condition) throws IOException { + + int startIndex = (condition.getPage() - 1) * condition.getPageSize(); + SearchRequest request = new SearchRequest(s.index); + SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + + if (StringUtils.hasText(condition.getLang())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("lang.keyword", condition.getLang())); + } + if (StringUtils.hasText(condition.getType())) { + boolQueryBuilder.filter(QueryBuilders.termQuery("type.keyword", condition.getType())); + } + + MatchPhraseQueryBuilder ptitleMP = QueryBuilders.matchPhraseQuery("title", condition.getKeyword()); + ptitleMP.boost(200); + MatchPhraseQueryBuilder ptextContentMP = QueryBuilders.matchPhraseQuery("textContent", condition.getKeyword()); + ptextContentMP.boost(100); + + boolQueryBuilder.should(ptitleMP).should(ptextContentMP); + + MatchQueryBuilder titleMP = QueryBuilders.matchQuery("title", condition.getKeyword()); + titleMP.boost(2); + MatchQueryBuilder textContentMP = QueryBuilders.matchQuery("textContent", condition.getKeyword()); + textContentMP.boost(1); + boolQueryBuilder.should(titleMP).should(textContentMP); + + boolQueryBuilder.minimumShouldMatch(1); + + sourceBuilder.query(boolQueryBuilder); + + HighlightBuilder highlightBuilder = new HighlightBuilder() + .field("textContent") + .field("title") + .fragmentSize(100) + .preTags("") + .postTags(""); + sourceBuilder.highlighter(highlightBuilder); + sourceBuilder.from(startIndex).size(condition.getPageSize()); + sourceBuilder.timeout(TimeValue.timeValueMinutes(1L)); + request.source(sourceBuilder); + SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); + List
data = new ArrayList<>(); + + for (SearchHit hit : response.getHits().getHits()) { + Map map = hit.getSourceAsMap(); + String highLight = map.get("textContent").toString(); + String title = map.getOrDefault("title", "").toString(); + Map highlightFields = hit.getHighlightFields(); + if (highlightFields.containsKey("textContent")) { + highLight = highlightFields.get("textContent").getFragments()[0].toString(); + } + if (highlightFields.containsKey("title")) { + title = highlightFields.get("title").getFragments()[0].toString(); + } + Article article = new Article().setId(hit.getId()) + .setArticleName(map.get("articleName").toString()) + .setLang(map.getOrDefault("lang", "").toString()) + .setPath(map.getOrDefault("path", "").toString()) + .setTitle(title) + .setVersion(map.getOrDefault("version", "").toString()) + .setType(map.getOrDefault("type", "").toString()) + .setTextContent(highLight); + data.add(article); + } + if (data.isEmpty()) { + return null; + } + + Map result = new HashMap<>(); + result.put("page", condition.getPage()); + result.put("pageSize", condition.getPageSize()); + result.put("records", data); + return result; + } + + + + + + public Map getCount(String keyword, String lang) throws IOException { + SearchRequest request = new SearchRequest(s.index); + SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + + boolQueryBuilder.filter(QueryBuilders.termQuery("lang.keyword", lang)); + + MatchQueryBuilder titleMP = QueryBuilders.matchQuery("title", keyword); + titleMP.boost(2); + MatchQueryBuilder textContentMP = QueryBuilders.matchQuery("textContent", keyword); + textContentMP.boost(1); + boolQueryBuilder.should(titleMP).should(textContentMP); + boolQueryBuilder.minimumShouldMatch(1); + + sourceBuilder.query(boolQueryBuilder); + + sourceBuilder.aggregation(AggregationBuilders.terms("data").field("type.keyword")); + request.source(sourceBuilder); + SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); + + List> numberList = new ArrayList<>(); + Map numberMap = new HashMap<>(); + numberMap.put("doc_count", response.getHits().getTotalHits().value); + numberMap.put("key", "all"); + numberList.add(numberMap); + ParsedTerms aggregation = response.getAggregations().get("data"); + List buckets = aggregation.getBuckets(); + for (Terms.Bucket bucket : buckets) { + Map countMap = new HashMap<>(); + countMap.put("key", bucket.getKeyAsString()); + countMap.put("doc_count", bucket.getDocCount()); + numberList.add(countMap); + } + Map result = new HashMap<>(); + result.put("total", numberList); + return result; + } + + @Override + public Map advancedSearch(Map search) throws Exception { + SearchRequest request = new SearchRequest(s.index); + SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + + int page = 1; + int pageSize = 10; + String keyword = ""; + for (Map.Entry entry : search.entrySet()) { + if (entry.getKey().equals("page")) { + page = Integer.parseInt(entry.getValue()); + continue; + } + if (entry.getKey().equals("pageSize")) { + pageSize = Integer.parseInt(entry.getValue()); + continue; + } + if (entry.getKey().equals("keyword")) { + keyword = entry.getValue(); + continue; + } + + boolQueryBuilder.filter(QueryBuilders.termQuery(entry.getKey() + ".keyword", entry.getValue())); + } + + int startIndex = (page - 1) * pageSize; + + if (!keyword.equals("")) { + MatchQueryBuilder titleMP = QueryBuilders.matchQuery("title", keyword); + titleMP.boost(2); + MatchQueryBuilder textContentMP = QueryBuilders.matchQuery("textContent", keyword); + textContentMP.boost(1); + boolQueryBuilder.should(titleMP).should(textContentMP); + + boolQueryBuilder.minimumShouldMatch(1); + } + sourceBuilder.from(startIndex).size(pageSize); + sourceBuilder.query(boolQueryBuilder); + + sourceBuilder.sort("date", SortOrder.DESC); + + request.source(sourceBuilder); + + + SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); + + Map result = new HashMap<>(); + List> data = new ArrayList<>(); + for (SearchHit hit : response.getHits().getHits()) { + Map map = hit.getSourceAsMap(); + + data.add(map); + } + result.put("page", page); + result.put("pageSize", pageSize); + result.put("count", response.getHits().getTotalHits().value); + result.put("records", data); + return result; + } + + @Override + public Map getTags(SearchTags searchTags) throws Exception { + SearchRequest request = new SearchRequest(s.index); + SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.filter(QueryBuilders.termQuery("lang.keyword", searchTags.getLang())); + boolQueryBuilder.filter(QueryBuilders.termQuery("category.keyword", searchTags.getCategory())); + + + if (searchTags.getCondition() != null) { + for (Map.Entry entry : searchTags.getCondition().entrySet()) { + boolQueryBuilder.filter(QueryBuilders.termQuery(entry.getKey() + ".keyword", entry.getValue())); + } + } + + + BucketOrder bucketOrder = BucketOrder.key(false); + sourceBuilder.aggregation(AggregationBuilders.terms("data").field(searchTags.getWant() + ".keyword").size(10000).order(bucketOrder)); + sourceBuilder.query(boolQueryBuilder); + request.source(sourceBuilder); + SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); + ParsedTerms aggregation = response.getAggregations().get("data"); + List> numberList = new ArrayList<>(); + List buckets = aggregation.getBuckets(); + for (Terms.Bucket bucket : buckets) { + + Map countMap = new HashMap<>(); + + countMap.put("key", bucket.getKeyAsString()); + countMap.put("count", bucket.getDocCount()); + numberList.add(countMap); + } + Map result = new HashMap<>(); + result.put("totalNum", numberList); + return result; + } + + + + + + + + + + public Suggest makeSuggest(String keyword) { + //定义suggest对象 + SuggestBuilder suggestBuilder = new SuggestBuilder(); + + return null; + } + + + + + + + @Override + public Set getSearchSuggest(Integer pageSize,String key){ + //定义suggest对象 + SuggestBuilder suggestBuilder = new SuggestBuilder(); + //定义本次查询名字SEARCH_INPUT = suggest,设置prefix 补齐前缀,查询个数pagesize个,skipDuplicates去除重复数据 + CompletionSuggestionBuilder suggestion = SuggestBuilders + .completionSuggestion("textTip.py").prefix(key, Fuzziness.TWO).size(pageSize).skipDuplicates(true); + + suggestBuilder.addSuggestion("py",suggestion); + SearchRequest request = new SearchRequest().indices(ts.index).source(new SearchSourceBuilder().suggest(suggestBuilder)); + //可以通过设置searchsourcebuilder来设置_source过滤字段 + SearchResponse searchResponse = null; + try { + searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT); + System.out.println(searchResponse); + } catch (IOException e) { + e.printStackTrace(); + } + + org.elasticsearch.search.suggest.Suggest suggest = searchResponse.getSuggest(); + Set keywords = null; + if (suggest != null) { + keywords = new HashSet<>(); + List> entries = suggest.getSuggestion("py").getEntries(); + for (org.elasticsearch.search.suggest.Suggest.Suggestion.Entry entry: entries) { + for (org.elasticsearch.search.suggest.Suggest.Suggestion.Entry.Option option: entry.getOptions()) { + /** 最多返回9个推荐,每个长度最大为20 */ + String keyword = option.getText().string(); + if (!StringUtils.isEmpty(keyword) && keyword.length() <= 20) { + /** 去除输入字段 */ + if (keyword.equals(key)) continue; + keywords.add(keyword); + if (keywords.size() >= pageSize) { + break; + } + } + } + } + } + return keywords; + } +} diff --git a/EaseSearch/src/main/java/com/search/docsearch/utils/EulerParse.java b/EaseSearch/src/main/java/com/search/docsearch/utils/EulerParse.java new file mode 100644 index 0000000000000000000000000000000000000000..29dbd776598c5840d6f02762682c1fd28163bb25 --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/utils/EulerParse.java @@ -0,0 +1,144 @@ +package com.search.docsearch.utils; + +import com.search.docsearch.constant.Constants; + +import org.apache.commons.io.FileUtils; +import org.commonmark.node.Node; +import org.commonmark.parser.Parser; +import org.commonmark.renderer.html.HtmlRenderer; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import org.springframework.util.StringUtils; +import org.yaml.snakeyaml.Yaml; + +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +public class EulerParse { + + public static final String BLOGS = "blog"; + public static final String DOCS = "docs"; + public static final String NEWS = "news"; + public static final String OTHER = "other"; + public static final String MIGRATION = "migration"; + public static final String SHOWCASE = "showcase"; + + + public static Map parse(String lang, String deleteType, File mdFile) throws Exception { + String type = deleteType; + String fileName = mdFile.getName(); + String path = mdFile.getPath() + .replace("\\", "/") + .replace(Constants.BASEPATH + lang + "/", "") + .replace("\\\\", "/") + .replace(".md", "") + .replace(".html", ""); + if (!DOCS.equals(deleteType) + && !BLOGS.equals(deleteType) + && !NEWS.equals(deleteType) + && !SHOWCASE.equals(deleteType) + && !MIGRATION.equals(deleteType)) { + type = OTHER; + if(!fileName.equals("index.html")) { + return null; + } + path = path.substring(0, path.length() - 5); + } + Map jsonMap = new HashMap<>(); + jsonMap.put("lang", lang); + jsonMap.put("deleteType", deleteType); + jsonMap.put("type", type); + jsonMap.put("articleName", fileName); + jsonMap.put("path", path); + + String fileContent = FileUtils.readFileToString(mdFile, StandardCharsets.UTF_8); + + + Parser parser = Parser.builder().build(); + HtmlRenderer renderer = HtmlRenderer.builder().build(); + + if (fileName.endsWith(".html")) { + Document node = Jsoup.parse(fileContent); + Elements titles = node.getElementsByTag("title"); + if (titles.size() > 0) { + jsonMap.put("title", titles.first().text()); + } + + Elements elements = node.getElementsByTag("main"); + if (elements.size() > 0) { + Element mainNode = elements.first(); + jsonMap.put("textContent", mainNode.text()); + } + } else { + if (DOCS.equals(type)) { + Node document = parser.parse(fileContent); + Document node = Jsoup.parse(renderer.render(document)); + + if (node.getElementsByTag("h1").size() > 0) { + jsonMap.put("title", node.getElementsByTag("h1").first().text()); + } else { + jsonMap.put("title", mdFile.getName()); + } + + if (node.getElementsByTag("a").size() > 0 && node.getElementsByTag("ul").size() > 0) { + Element a = node.getElementsByTag("a").first(); + if (a.attr("href").startsWith("#")) { + node.getElementsByTag("ul").first().remove(); + } + } + jsonMap.put("textContent",node.text()); + + String version = path.replaceFirst(type + "/", ""); + version = version.substring(0, version.indexOf("/")); + + jsonMap.put("version", version); + } else { + String r = ""; + if (fileContent.contains("---")) { + fileContent = fileContent.substring(fileContent.indexOf("---") + 3); + if (fileContent.contains("---")) { + r = fileContent.substring(0, fileContent.indexOf("---")); + fileContent = fileContent.substring(fileContent.indexOf("---") + 3); + } + } + + + Node document = parser.parse(fileContent); + Document node = Jsoup.parse(renderer.render(document)); + jsonMap.put("textContent", node.text()); + + + Yaml yaml = new Yaml(); + Map ret = yaml.load(r); + + String key = ""; + Object value = ""; + for (Map.Entry entry : ret.entrySet()) { + //TODO 需要处理日期不标准导致的存入ES失败的问题。 + key = entry.getKey().toLowerCase(Locale.ROOT); + value = entry.getValue(); + if (key.equals("date")) { + String archives = value.toString().substring(0, 7); + jsonMap.put("archives", archives); + } + if (key.equals("author") && value instanceof String) { + value = new String[]{value.toString()}; + } + jsonMap.put(key, value); + } + } + } + + if (jsonMap.get("title") == "" || jsonMap.get("textContent") == "") { + return null; + } + + return jsonMap; + } + +} diff --git a/EaseSearch/src/main/java/com/search/docsearch/utils/IdUtil.java b/EaseSearch/src/main/java/com/search/docsearch/utils/IdUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..6ccfffecc36936c1a4e75640cc6864c90e82440d --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/utils/IdUtil.java @@ -0,0 +1,9 @@ +package com.search.docsearch.utils; + +import java.util.UUID; + +public class IdUtil { + public static String getId() { + return UUID.randomUUID().toString().replaceAll("-", ""); + } +} diff --git a/EaseSearch/src/main/java/com/search/docsearch/utils/commonUse.java b/EaseSearch/src/main/java/com/search/docsearch/utils/commonUse.java new file mode 100644 index 0000000000000000000000000000000000000000..6e7ca98c7db83bae2f66b39f8e1884efafa5c7d6 --- /dev/null +++ b/EaseSearch/src/main/java/com/search/docsearch/utils/commonUse.java @@ -0,0 +1,37 @@ +package com.search.docsearch.utils; + +public class commonUse { + public static String getValue(String r, String t) { + String result = ""; + + for(int i = 0; i < r.length(); i ++) { + if (r.contains(t)) { + r = r.substring(r.indexOf(t) + t.length()); + if (r.substring(0, 4).contains("=")) { + result = r.substring(r.indexOf("=") + 1); + if (t.equals("tags") || t.equals("categories")) { + result = result.substring(result.indexOf("[") + 1); + result = result.substring(0, result.indexOf("]")); + result = result.replaceAll("'", ""); + break; + } else { + if (result.substring(0, 3).contains("'")) { + result = result.substring(result.indexOf("'") + 1); + result = result.substring(0, result.indexOf("'")); + } else if (result.substring(0, 3).contains("\"")){ + result = result.substring(result.indexOf("\"") + 1); + result = result.substring(0, result.indexOf("\"")); + } + break; + } + } + } else { + break; + } + } + + + return result; + } + +} diff --git a/EaseSearch/src/main/resources/application.yml b/EaseSearch/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..436e920f1b5fcffe10e19259ded1d508a0f74128 --- /dev/null +++ b/EaseSearch/src/main/resources/application.yml @@ -0,0 +1,17 @@ +#es用户名 密码等配置 +elasticsearch: + host: ${eshost} + username: ${esusername} + password: ${espassword} + port: ${esport} + +#定时读取配置 +scheduled: + cron: 0 31 11 ? * * + +#openEuler openGauss openLookeng mindSpore +system: ${searchsystem:openEuler} +docsversion: 20 + +#formal test +dep: ${depp:test} diff --git a/EaseSearch/src/main/resources/mapping/mapping.json b/EaseSearch/src/main/resources/mapping/mapping.json new file mode 100644 index 0000000000000000000000000000000000000000..b06260ace16990865b9653d8ee39530b60fd6417 --- /dev/null +++ b/EaseSearch/src/main/resources/mapping/mapping.json @@ -0,0 +1,94 @@ +{ + "properties": { + "_class": { + "type": "keyword", + "index": false, + "doc_values": false + }, + "articleName": { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "id": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above" : 256 + } + } + }, + "lang": { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "path": { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "textContent": { + "type": "text", + "analyzer": "ik_max_word", + "search_analyzer": "ik_smart" + }, + "title": { + "type": "text", + "analyzer": "ik_max_word", + "search_analyzer": "ik_smart" + }, + "type": { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "deleteType": { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "version": { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "date" : { + "type" : "date" + }, + "archives": { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + } + } +} diff --git a/EaseSearch/src/main/resources/mapping/tips_mapping.json b/EaseSearch/src/main/resources/mapping/tips_mapping.json new file mode 100644 index 0000000000000000000000000000000000000000..8127ac5bd15dded14f1c38cdbfacba04cd908b47 --- /dev/null +++ b/EaseSearch/src/main/resources/mapping/tips_mapping.json @@ -0,0 +1,36 @@ +{ + "properties": { + "id": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above" : 256 + } + } + }, + "lang": { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "textTip": { + "type": "completion", + "analyzer": "ik_smart", + "fields": { + "kw": { + "type": "keyword" + }, + "py": { + "type": "completion", + "boost": 1, + "analyzer": "pinyin" + } + } + } + } +} \ No newline at end of file diff --git a/EaseSearch/src/main/resources/script/mindspore/initDoc.sh b/EaseSearch/src/main/resources/script/mindspore/initDoc.sh new file mode 100644 index 0000000000000000000000000000000000000000..4bf81c1571318f53e7f5090e2b29460466daf9fb --- /dev/null +++ b/EaseSearch/src/main/resources/script/mindspore/initDoc.sh @@ -0,0 +1,44 @@ +#!/bin/sh +if [ -d "/usr/local/docs" ]; then + rm -rf /usr/local/docs/source/* + rm -rf /usr/local/docs/target/* +fi +mkdir -p /usr/local/docs/source/ +mkdir -p /usr/local/docs/target/zh/ +mkdir -p /usr/local/docs/target/en/ + + +# shellcheck disable=SC2164 +cd /usr/local/docs/source +git clone https://gitee.com/mindspore/mindspore.github.io.git + +mkdir -p /usr/local/docs/target/zh/install/ + + + + +mkdir -p /usr/local/docs/target/zh/tutorial/ +cp -r ./webapp/public/tutorials/zh-CN/* ../target/zh/tutorial/zh-CN/ +cp -r ./webapp/public/tutorials/application/zh-CN/* ../target/zh/tutorial/application/zh-CN/ +cp -r ./webapp/public/tutorials/experts/zh-CN/* ../target/zh/tutorial/experts/zh-CN/ + + +mkdir -p /usr/local/docs/target/zh/api/ +mkdir -p /usr/local/docs/target/zh/docs/ +cp -r ./webapp/public/docs/zh-CN/* ../target/docs/zh-CN/* + + + + + + + + + +mkdir -p /usr/local/docs/target/en/install/ +mkdir -p /usr/local/docs/target/en/tutorial/ +cp -r ./webapp/public/tutorials/en/* ../target/en/tutorial/en/ +cp -r ./webapp/public/tutorials/application/en/* ../target/en/tutorial/application/en/ +cp -r ./webapp/public/tutorials/experts/en/* ../target/en/tutorial/experts/en/ +mkdir -p /usr/local/docs/target/en/api/ +mkdir -p /usr/local/docs/target/en/docs/ \ No newline at end of file diff --git a/EaseSearch/src/main/resources/script/openeuler/initDoc.sh b/EaseSearch/src/main/resources/script/openeuler/initDoc.sh new file mode 100644 index 0000000000000000000000000000000000000000..352c895094589e6fcc993a01926077c4ddcf8149 --- /dev/null +++ b/EaseSearch/src/main/resources/script/openeuler/initDoc.sh @@ -0,0 +1,88 @@ +#!/bin/bash +if [ -d "/usr/local/docs" ]; then + rm -rf /usr/local/docs/source/* + rm -rf /usr/local/docs/target/* +fi + +npm i pnpm -g + +mkdir -p /usr/local/docs/source/ +mkdir -p /usr/local/docs/target/zh/ +mkdir -p /usr/local/docs/target/en/ +mkdir -p /usr/local/docs/target/ru/ + +# shellcheck disable=SC2164 +cd /usr/local/docs/source +git clone https://gitee.com/openeuler/openEuler-portal.git +# shellcheck disable=SC2164 +cd ./openEuler-portal +pnpm install +pnpm build + + + +cp -r /usr/local/docs/source/openEuler-portal/app/.vitepress/dist/zh /usr/local/docs/target/ +cp -r /usr/local/docs/source/openEuler-portal/app/.vitepress/dist/en /usr/local/docs/target/ +cp -r /usr/local/docs/source/openEuler-portal/app/.vitepress/dist/ru /usr/local/docs/target/ + + +rm -rf /usr/local/docs/target/zh/blog +cp -r /usr/local/docs/source/openEuler-portal/app/zh/blog /usr/local/docs/target/zh/ +rm -rf /usr/local/docs/target/zh/news +cp -r /usr/local/docs/source/openEuler-portal/app/zh/news /usr/local/docs/target/zh/ +rm -rf /usr/local/docs/target/zh/showcase +cp -r /usr/local/docs/source/openEuler-portal/app/zh/showcase /usr/local/docs/target/zh/ +cp /usr/local/docs/source/openEuler-portal/app/.vitepress/dist/zh/showcase/index.html /usr/local/docs/target/zh/showcase/ +rm -rf /usr/local/docs/target/zh/migration +cp -r /usr/local/docs/source/openEuler-portal/app/zh/migration /usr/local/docs/target/zh/ + + +rm -rf /usr/local/docs/target/en/blog +cp -r /usr/local/docs/source/openEuler-portal/app/en/blog /usr/local/docs/target/en/ +rm -rf /usr/local/docs/target/en/news +cp -r /usr/local/docs/source/openEuler-portal/app/en/news /usr/local/docs/target/en/ +rm -rf /usr/local/docs/target/en/showcase +cp -r /usr/local/docs/source/openEuler-portal/app/en/showcase /usr/local/docs/target/en/ +cp /usr/local/docs/source/openEuler-portal/app/.vitepress/dist/en/showcase/index.html /usr/local/docs/target/en/showcase/ +rm -rf /usr/local/docs/target/en/migration +cp -r /usr/local/docs/source/openEuler-portal/app/zh/migration /usr/local/docs/target/zh/ + +rm -rf /usr/local/docs/target/ru/blog +cp -r /usr/local/docs/source/openEuler-portal/app/ru/blog /usr/local/docs/target/ru/ +rm -rf /usr/local/docs/target/ru/news +cp -r /usr/local/docs/source/openEuler-portal/app/ru/news /usr/local/docs/target/ru/ +rm -rf /usr/local/docs/target/ru/showcase +cp -r /usr/local/docs/source/openEuler-portal/app/ru/showcase /usr/local/docs/target/ru/ +cp /usr/local/docs/source/openEuler-portal/app/.vitepress/dist/ru/showcase/index.html /usr/local/docs/target/ru/showcase/ +rm -rf /usr/local/docs/target/ru/migration +cp -r /usr/local/docs/source/openEuler-portal/app/zh/migration /usr/local/docs/target/zh/ + + +# shellcheck disable=SC2164 +cd /usr/local/docs/source + +git clone https://gitee.com/openeuler/docs.git + +# shellcheck disable=SC2164 +cd ./docs +for r in $(git branch -r --list "origin/stable2-*") +do + b=${r##*origin/stable2-} + git checkout -b $b $r + mkdir -p /usr/local/docs/target/zh/docs/$b/docs + mkdir -p /usr/local/docs/target/en/docs/$b/docs + cp -r /usr/local/docs/source/docs/docs/zh/docs/* /usr/local/docs/target/zh/docs/$b/docs/ + cp -r /usr/local/docs/source/docs/docs/en/docs/* /usr/local/docs/target/en/docs/$b/docs/ +done + + + + + + + + + + + + diff --git a/EaseSearch/src/main/resources/script/openeuler/updateDoc.sh b/EaseSearch/src/main/resources/script/openeuler/updateDoc.sh new file mode 100644 index 0000000000000000000000000000000000000000..e87fab41d3d3b35eb09e2499d526d5ac1a60f733 --- /dev/null +++ b/EaseSearch/src/main/resources/script/openeuler/updateDoc.sh @@ -0,0 +1,63 @@ +#!/bin/bash + +rm -rf /usr/local/docs/target/* +mkdir -p /usr/local/docs/target/zh/ +mkdir -p /usr/local/docs/target/en/ + +# shellcheck disable=SC2164 +cd /usr/local/docs/source/openEuler-portal +git pull +pnpm install +pnpm build + + +cp -r /usr/local/docs/source/openEuler-portal/app/.vitepress/dist/zh /usr/local/docs/target/ +cp -r /usr/local/docs/source/openEuler-portal/app/.vitepress/dist/en /usr/local/docs/target/ +cp -r /usr/local/docs/source/openEuler-portal/app/.vitepress/dist/ru /usr/local/docs/target/ + + +rm -rf /usr/local/docs/target/zh/blog +cp -r /usr/local/docs/source/openEuler-portal/app/zh/blog /usr/local/docs/target/zh/ +rm -rf /usr/local/docs/target/zh/news +cp -r /usr/local/docs/source/openEuler-portal/app/zh/news /usr/local/docs/target/zh/ +rm -rf /usr/local/docs/target/zh/showcase +cp -r /usr/local/docs/source/openEuler-portal/app/zh/showcase /usr/local/docs/target/zh/ +cp /usr/local/docs/source/openEuler-portal/app/.vitepress/dist/zh/showcase/index.html /usr/local/docs/target/zh/showcase/ +rm -rf /usr/local/docs/target/zh/migration +cp -r /usr/local/docs/source/openEuler-portal/app/zh/migration /usr/local/docs/target/zh/ + + +rm -rf /usr/local/docs/target/en/blog +cp -r /usr/local/docs/source/openEuler-portal/app/en/blog /usr/local/docs/target/en/ +rm -rf /usr/local/docs/target/en/news +cp -r /usr/local/docs/source/openEuler-portal/app/en/news /usr/local/docs/target/en/ +rm -rf /usr/local/docs/target/en/showcase +cp -r /usr/local/docs/source/openEuler-portal/app/en/showcase /usr/local/docs/target/en/ +cp /usr/local/docs/source/openEuler-portal/app/.vitepress/dist/en/showcase/index.html /usr/local/docs/target/en/showcase/ +rm -rf /usr/local/docs/target/en/migration +cp -r /usr/local/docs/source/openEuler-portal/app/zh/migration /usr/local/docs/target/zh/ + +rm -rf /usr/local/docs/target/ru/blog +cp -r /usr/local/docs/source/openEuler-portal/app/ru/blog /usr/local/docs/target/ru/ +rm -rf /usr/local/docs/target/ru/news +cp -r /usr/local/docs/source/openEuler-portal/app/ru/news /usr/local/docs/target/ru/ +rm -rf /usr/local/docs/target/ru/showcase +cp -r /usr/local/docs/source/openEuler-portal/app/ru/showcase /usr/local/docs/target/ru/ +cp /usr/local/docs/source/openEuler-portal/app/.vitepress/dist/ru/showcase/index.html /usr/local/docs/target/ru/showcase/ +rm -rf /usr/local/docs/target/ru/migration +cp -r /usr/local/docs/source/openEuler-portal/app/zh/migration /usr/local/docs/target/zh/ + + +# shellcheck disable=SC2164 +cd /usr/local/docs/source/docs +git pull +for r in $(git branch -r --list "origin/stable2-*") +do + b=${r##*origin/stable2-} + git checkout -b $b $r + git pull + mkdir -p /usr/local/docs/target/zh/docs/$b/docs + mkdir -p /usr/local/docs/target/en/docs/$b/docs + cp -r /usr/local/docs/source/docs/docs/zh/docs/* /usr/local/docs/target/zh/docs/$b/docs/ + cp -r /usr/local/docs/source/docs/docs/en/docs/* /usr/local/docs/target/en/docs/$b/docs/ +done \ No newline at end of file diff --git a/EaseSearch/src/main/resources/script/opengauss/initDoc.sh b/EaseSearch/src/main/resources/script/opengauss/initDoc.sh new file mode 100644 index 0000000000000000000000000000000000000000..c995e7fd0bb17041ce02908a4a02a04a978cf07b --- /dev/null +++ b/EaseSearch/src/main/resources/script/opengauss/initDoc.sh @@ -0,0 +1,52 @@ +#!/bin/bash +if [ -d "/usr/local/docs" ]; then + rm -rf /usr/local/docs/source/* + rm -rf /usr/local/docs/target/* +fi +mkdir -p /usr/local/docs/source/ +mkdir -p /usr/local/docs/target/zh/ +mkdir -p /usr/local/docs/target/en/ + +# shellcheck disable=SC2164 +cd /usr/local/docs/source +git clone https://gitee.com/opengauss/website.git +git clone https://gitee.com/opengauss/blog.git + + +mkdir -p /usr/local/docs/target/zh/events/ +mkdir -p /usr/local/docs/target/zh/news/ +mkdir -p /usr/local/docs/target/zh/post/ +cp -r ./website/content/zh/events/* ../target/zh/events/ +cp -r ./website/content/zh/news/* ../target/zh/news/ +cp -r ./blog/content/zh/post/* ../target/zh/post/ + +mkdir -p /usr/local/docs/target/en/events/ +mkdir -p /usr/local/docs/target/en/news/ +mkdir -p /usr/local/docs/target/en/post/ +cp -r ./website/content/en/events/* ../target/en/events/ +cp -r ./website/content/en/news/* ../target/en/news/ +cp -r ./blog/content/en/post/* ../target/en/post/ + + + +git clone https://gitee.com/opengauss/docs.git +cd ./docs + +for r in $(git branch -r --list "origin/*"); do + b=${r##*origin/} + # shellcheck disable=SC2170 + # shellcheck disable=SC1073 + # shellcheck disable=SC1072 + # shellcheck disable=SC1020 + # shellcheck disable=SC1009 + if [[ "master" != $b ]] && [[ "website" != $b ]] && [[ "HEAD" != $b ]] && [[ "->" != $b ]]; then + git checkout $b + mkdir -p /usr/local/docs/target/zh/docs/$b/docs + mkdir -p /usr/local/docs/target/en/docs/$b/docs + cp -r ./content/zh/docs/* /usr/local/docs/target/zh/docs/$b/docs/ + cp -r ./content/en/docs/* /usr/local/docs/target/en/docs/$b/docs/ + fi +done + + + diff --git a/EaseSearch/src/main/resources/script/opengauss/updateDoc.sh b/EaseSearch/src/main/resources/script/opengauss/updateDoc.sh new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/EaseSearch/src/test/java/com/search/docsearch/DocSearchApplicationTests.java b/EaseSearch/src/test/java/com/search/docsearch/DocSearchApplicationTests.java new file mode 100644 index 0000000000000000000000000000000000000000..e48d92d75040ffcb0e3cf3899f63faf56e340d4c --- /dev/null +++ b/EaseSearch/src/test/java/com/search/docsearch/DocSearchApplicationTests.java @@ -0,0 +1,79 @@ +package com.search.docsearch; + +import com.search.docsearch.config.MySystem; +import com.search.docsearch.constant.Constants; +import com.search.docsearch.utils.EulerParse; +import com.search.docsearch.utils.IdUtil; +import org.apache.commons.io.FileUtils; +import org.elasticsearch.action.index.IndexRequest; +import org.elasticsearch.action.index.IndexResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.TermQueryBuilder; +import org.elasticsearch.index.reindex.BulkByScrollResponse; +import org.elasticsearch.index.reindex.DeleteByQueryRequest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.context.SpringBootTest; + +import java.io.File; +import java.io.IOException; +import java.util.Map; + +@SpringBootTest +class DocSearchApplicationTests { + @Autowired + @Qualifier("restHighLevelClient") + private RestHighLevelClient restHighLevelClient; + + @Autowired + @Qualifier("setConfig") + private MySystem s; + + + + @Test + void contextLoads() throws IOException { + + DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(""); + BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); + boolQueryBuilder.must(new TermQueryBuilder("lang", "zh")); + boolQueryBuilder.must(new TermQueryBuilder("type", "news")); + deleteByQueryRequest.setQuery(boolQueryBuilder); + BulkByScrollResponse bulkByScrollResponse = restHighLevelClient.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT); + System.out.println(bulkByScrollResponse); + } + + + + @Test + void testPa() throws Exception { + File mdFile = FileUtils.getFile("C:\\CYDev\\workspace\\eulerdoc\\openEuler-portal\\app\\.vitepress\\dist\\zh\\learn\\mooc\\detail\\index.html"); + Map map = EulerParse.parse("zh", "download", mdFile); + + System.out.println(map); + + + IndexRequest indexRequest = new IndexRequest(s.index).id(IdUtil.getId()).source(map); + + IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT); + System.out.println(indexResponse.toString()); +// String s = "012345"; +// System.out.println(s.substring(0, 6)); + } + + + + + + @Test + void ines() throws IOException { + String d = "2022-04-02"; + String archives = d.toString().substring(1, 13); + System.out.println(archives); + } + + +}