初始化

This commit is contained in:
2026-02-22 18:55:40 +08:00
commit 8392cdd861
496 changed files with 45020 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.easyagents</groupId>
<artifactId>easy-agents-search-engine</artifactId>
<version>${revision}</version>
</parent>
<name>easy-agents-search-engine-es</name>
<artifactId>easy-agents-search-engine-es</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.easyagents</groupId>
<artifactId>easy-agents-search-engine-service</artifactId>
</dependency>
<dependency>
<groupId>com.easyagents</groupId>
<artifactId>easy-agents-core</artifactId>
</dependency>
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.15.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 或与Elasticsearch客户端兼容的版本 -->
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,56 @@
/*
* Copyright (c) 2023-2026, Easy-Agents (fuhai999@gmail.com).
* <p>
* Licensed 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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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.
*/
package com.easyagents.engine.es;
public class ESConfig {
private String host;
private String userName;
private String password;
private String indexName;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getIndexName() {
return indexName;
}
public void setIndexName(String indexName) {
this.indexName = indexName;
}
}

View File

@@ -0,0 +1,223 @@
package com.easyagents.engine.es;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.*;
import co.elastic.clients.elasticsearch.core.bulk.BulkOperation;
import co.elastic.clients.elasticsearch.core.bulk.IndexOperation;
import co.elastic.clients.json.JsonData;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import com.easyagents.core.document.Document;
import com.easyagents.search.engine.service.DocumentSearcher;
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.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.*;
public class ElasticSearcher implements DocumentSearcher {
private static final Logger LOG = LoggerFactory.getLogger(ElasticSearcher.class);
private final ESConfig esConfig;
public ElasticSearcher(ESConfig esConfig) {
this.esConfig = esConfig;
}
// 忽略 SSL 的 client 构建逻辑
private RestClient buildRestClient() throws NoSuchAlgorithmException, KeyManagementException {
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}
};
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(
AuthScope.ANY,
new UsernamePasswordCredentials(esConfig.getUserName(), esConfig.getPassword()));
return RestClient.builder(HttpHost.create(esConfig.getHost()))
.setHttpClientConfigCallback(httpClientBuilder -> {
httpClientBuilder.setSSLContext(sslContext);
httpClientBuilder.setSSLHostnameVerifier((hostname, session) -> true);
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
return httpClientBuilder;
})
.build();
}
/**
* 添加文档到Elasticsearch
*/
@Override
public boolean addDocument(Document document) {
if (document == null || document.getContent() == null) {
return false;
}
RestClient restClient = null;
ElasticsearchTransport transport = null;
try {
restClient = buildRestClient();
transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
Map<String, Object> source = new HashMap<>();
source.put("id", document.getId());
source.put("content", document.getContent());
if (document.getTitle() != null) {
source.put("title", document.getTitle());
}
String documentId = document.getId().toString();
IndexOperation<?> indexOp = IndexOperation.of(i -> i
.index(esConfig.getIndexName())
.id(documentId)
.document(JsonData.of(source))
);
BulkOperation bulkOp = BulkOperation.of(b -> b.index(indexOp));
BulkRequest request = BulkRequest.of(b -> b.operations(Collections.singletonList(bulkOp)));
BulkResponse response = client.bulk(request);
return !response.errors();
} catch (Exception e) {
LOG.error(e.getMessage(), e);
return false;
} finally {
closeResources(transport, restClient);
}
}
@Override
public List<Document> searchDocuments(String keyword, int count) {
RestClient restClient = null;
ElasticsearchTransport transport = null;
try {
restClient = buildRestClient();
transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
SearchRequest request = SearchRequest.of(s -> s
.index(esConfig.getIndexName())
.size(count)
.query(q -> q
.match(m -> m
.field("title")
.field("content")
.query(keyword)
)
)
);
SearchResponse<Document> response = client.search(request, Document.class);
List<Document> results = new ArrayList<>();
response.hits().hits().forEach(hit -> results.add(hit.source()));
return results;
} catch (Exception e) {
LOG.error(e.getMessage(), e);
return Collections.emptyList();
} finally {
closeResources(transport, restClient);
}
}
@Override
public boolean deleteDocument(Object id) {
if (id == null) {
return false;
}
RestClient restClient = null;
ElasticsearchTransport transport = null;
try {
restClient = buildRestClient();
transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
DeleteRequest request = DeleteRequest.of(d -> d
.index(esConfig.getIndexName())
.id(id.toString())
);
DeleteResponse response = client.delete(request);
return response.result() == co.elastic.clients.elasticsearch._types.Result.Deleted;
} catch (Exception e) {
LOG.error("Error deleting document with id: " + id, e);
return false;
} finally {
closeResources(transport, restClient);
}
}
@Override
public boolean updateDocument(Document document) {
if (document == null || document.getId() == null) {
return false;
}
RestClient restClient = null;
ElasticsearchTransport transport = null;
try {
restClient = buildRestClient();
transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
UpdateRequest<Document, Object> request = UpdateRequest.of(u -> u
.index(esConfig.getIndexName())
.id(document.getId().toString())
.doc(document)
);
UpdateResponse<Document> response = client.update(request, Object.class);
return response.result() == co.elastic.clients.elasticsearch._types.Result.Updated;
} catch (Exception e) {
LOG.error("Error updating document with id: " + document.getId(), e);
return false;
} finally {
closeResources(transport, restClient);
}
}
private void closeResources(AutoCloseable... closeables) {
for (AutoCloseable closeable : closeables) {
try {
if (closeable != null)
closeable.close();
} catch (Exception e) {
LOG.error("Error closing resource", e);
}
}
}
}

View File

@@ -0,0 +1,42 @@
package com.easyagents.search.engines.es;
import com.easyagents.core.document.Document;
import com.easyagents.engine.es.ESConfig;
import com.easyagents.engine.es.ElasticSearcher;
import java.math.BigInteger;
import java.util.List;
public class ElasticSearcherTest {
public static void main(String[] args) throws Exception {
// 创建工具类实例 (忽略SSL证书如果有认证则提供用户名密码)
ESConfig searcherConfig = new ESConfig();
searcherConfig.setHost("https://127.0.0.1:9200");
searcherConfig.setUserName("elastic");
searcherConfig.setPassword("elastic");
searcherConfig.setIndexName("aiknowledge");
ElasticSearcher esUtil = new ElasticSearcher(searcherConfig);
Document document1 = new Document();
document1.setContent("平台客服工具:是指拼多多平台开发并向商家提供的功能或工具,商家通过其专属账号登录平台客服工具后,可以与平台消费者取得\\n\" +\n" +
" \"联系并为消费者提供客户服务");
document1.setId(BigInteger.valueOf(1));
esUtil.addDocument(document1);
Document document2 = new Document();
document2.setId(2);
document2.setContent("document 2 的内容");
document2.setTitle("document 2");
esUtil.addDocument(document2);
System.out.println("查询开始--------");
List<Document> res = esUtil.searchDocuments("客服");
res.forEach(System.out::println);
System.out.println("查询结束--------");
document1.setTitle("document 3");
esUtil.updateDocument(document1);
// esUtil.deleteDocument(1);
}
}

View File

@@ -0,0 +1,55 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.easyagents</groupId>
<artifactId>easy-agents-search-engine</artifactId>
<version>${revision}</version>
</parent>
<name>easy-agents-search-engine-lucene</name>
<artifactId>easy-agents-search-engine-lucene</artifactId>
<properties>
<jcseg.version>2.6.3</jcseg.version>
<lucene.version>8.11.1</lucene.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.easyagents</groupId>
<artifactId>easy-agents-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>${lucene.version}</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>${lucene.version}</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>${lucene.version}</version>
</dependency>
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>jcseg-core</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>jcseg-analyzer</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>com.easyagents</groupId>
<artifactId>easy-agents-search-engine-service</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,29 @@
/*
* Copyright (c) 2023-2026, Easy-Agents (fuhai999@gmail.com).
* <p>
* Licensed 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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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.
*/
package com.easyagents.search.engine.lucene;
public class LuceneConfig {
// lucene 目录
private String indexDirPath;
public String getIndexDirPath() {
return indexDirPath;
}
public void setIndexDirPath(String indexDirPath) {
this.indexDirPath = indexDirPath;
}
}

View File

@@ -0,0 +1,212 @@
/*
* Copyright (c) 2023-2026, Easy-Agents (fuhai999@gmail.com).
* <p>
* Licensed 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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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.
*/
package com.easyagents.search.engine.lucene;
import com.easyagents.core.document.Document;
import com.easyagents.search.engine.service.DocumentSearcher;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.*;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.*;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.jetbrains.annotations.NotNull;
import org.lionsoul.jcseg.ISegment;
import org.lionsoul.jcseg.analyzer.JcsegAnalyzer;
import org.lionsoul.jcseg.dic.DictionaryFactory;
import org.lionsoul.jcseg.segmenter.SegmenterConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class LuceneSearcher implements DocumentSearcher {
private static final Logger LOG = LoggerFactory.getLogger(LuceneSearcher.class);
private Directory directory;
public LuceneSearcher(LuceneConfig config) {
Objects.requireNonNull(config, "LuceneConfig 不能为 null");
try {
String indexDirPath = config.getIndexDirPath(); // 索引目录路径
File indexDir = new File(indexDirPath);
if (!indexDir.exists() && !indexDir.mkdirs()) {
throw new IllegalStateException("can not mkdirs for path: " + indexDirPath);
}
this.directory = FSDirectory.open(indexDir.toPath());
} catch (IOException e) {
LOG.error("初始化 Lucene 索引失败", e);
throw new RuntimeException(e);
}
}
@Override
public boolean addDocument(Document document) {
if (document == null || document.getContent() == null) return false;
IndexWriter indexWriter = null;
try {
indexWriter = createIndexWriter();
org.apache.lucene.document.Document luceneDoc = new org.apache.lucene.document.Document();
luceneDoc.add(new StringField("id", document.getId().toString(), Field.Store.YES));
luceneDoc.add(new TextField("content", document.getContent(), Field.Store.YES));
if (document.getTitle() != null) {
luceneDoc.add(new TextField("title", document.getTitle(), Field.Store.YES));
}
indexWriter.addDocument(luceneDoc);
indexWriter.commit();
return true;
} catch (Exception e) {
LOG.error("添加文档失败", e);
return false;
} finally {
close(indexWriter);
}
}
@Override
public boolean deleteDocument(Object id) {
if (id == null) return false;
IndexWriter indexWriter = null;
try {
indexWriter = createIndexWriter();
Term term = new Term("id", id.toString());
indexWriter.deleteDocuments(term);
indexWriter.commit();
return true;
} catch (IOException e) {
LOG.error("删除文档失败", e);
return false;
} finally {
close(indexWriter);
}
}
@Override
public boolean updateDocument(Document document) {
if (document == null || document.getId() == null) return false;
IndexWriter indexWriter = null;
try {
indexWriter = createIndexWriter();
Term term = new Term("id", document.getId().toString());
org.apache.lucene.document.Document luceneDoc = new org.apache.lucene.document.Document();
luceneDoc.add(new StringField("id", document.getId().toString(), Field.Store.YES));
luceneDoc.add(new TextField("content", document.getContent(), Field.Store.YES));
if (document.getTitle() != null) {
luceneDoc.add(new TextField("title", document.getTitle(), Field.Store.YES));
}
indexWriter.updateDocument(term, luceneDoc);
indexWriter.commit();
return true;
} catch (IOException e) {
LOG.error("更新文档失败", e);
return false;
} finally {
close(indexWriter);
}
}
@Override
public List<Document> searchDocuments(String keyword, int count) {
List<Document> results = new ArrayList<>();
try (IndexReader reader = DirectoryReader.open(directory)) {
IndexSearcher searcher = new IndexSearcher(reader);
Query query = buildQuery(keyword);
TopDocs topDocs = searcher.search(query, count);
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
org.apache.lucene.document.Document doc = searcher.doc(scoreDoc.doc);
Document resultDoc = new Document();
resultDoc.setId(doc.get("id"));
resultDoc.setContent(doc.get("content"));
resultDoc.setTitle(doc.get("title"));
resultDoc.setScore((double) scoreDoc.score);
results.add(resultDoc);
}
} catch (Exception e) {
LOG.error("搜索文档失败", e);
}
return results;
}
private static Query buildQuery(String keyword) {
try {
Analyzer analyzer = createAnalyzer();
QueryParser titleQueryParser = new QueryParser("title", analyzer);
Query titleQuery = titleQueryParser.parse(keyword);
BooleanClause titleBooleanClause = new BooleanClause(titleQuery, BooleanClause.Occur.SHOULD);
QueryParser contentQueryParser = new QueryParser("content", analyzer);
Query contentQuery = contentQueryParser.parse(keyword);
BooleanClause contentBooleanClause = new BooleanClause(contentQuery, BooleanClause.Occur.SHOULD);
BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.add(titleBooleanClause)
.add(contentBooleanClause);
return builder.build();
} catch (ParseException e) {
LOG.error(e.toString(), e);
}
return null;
}
@NotNull
private IndexWriter createIndexWriter() throws IOException {
Analyzer analyzer = createAnalyzer();
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
return new IndexWriter(directory, indexWriterConfig);
}
private static Analyzer createAnalyzer() {
SegmenterConfig config = new SegmenterConfig(true);
return new JcsegAnalyzer(ISegment.Type.NLP, config, DictionaryFactory.createSingletonDictionary(config));
}
public void close(IndexWriter indexWriter) {
try {
if (indexWriter != null) {
indexWriter.close();
}
} catch (IOException e) {
LOG.error("关闭 Lucene 失败", e);
}
}
}

View File

@@ -0,0 +1,96 @@
/*
* Copyright (c) 2023-2026, Easy-Agents (fuhai999@gmail.com).
* <p>
* Licensed 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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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.
*/
package com.easyagents.engines.test;
import com.easyagents.core.document.Document;
import com.easyagents.search.engine.lucene.LuceneConfig;
import com.easyagents.search.engine.lucene.LuceneSearcher;
import java.util.List;
public class TestLuceneCRUD {
public static void main(String[] args) {
// 1. 配置 Lucene 索引路径
LuceneConfig config = new LuceneConfig();
config.setIndexDirPath("./2lucene_index"); // 设置索引目录路径
// 2. 创建 LuceneSearcher 实例
LuceneSearcher luceneSearcher = new LuceneSearcher(config);
// 文档ID用于更新和删除
// ---- Step 1: 添加文档 ----
System.out.println("【添加文档】");
Document doc1 = new Document();
doc1.setId(1);
doc1.setTitle("利润最大化的原则");
doc1.setContent("平台客服工具:是指拼多多平台开发并向企业提供的功能或工具,商家通过其专属账号登录平台客服工具后,可以与平台消费者取得\n" +
"联系并为消费者提供客户服务");
boolean addSuccess = luceneSearcher.addDocument(doc1);
System.out.println("添加文档1结果" + (addSuccess ? "成功" : "失败"));
Document doc2 = new Document();
doc2.setId(2);
doc2.setTitle("企业获取报酬的活动");
doc2.setContent("研究如何最合理地分配稀缺资源及不同的用途");
boolean addSuccess1 = luceneSearcher.addDocument(doc2);
System.out.println("添加文档2结果" + (addSuccess1 ? "成功" : "失败"));
// 查询添加后的结果
testSearch(luceneSearcher, "企业");
testSearch(luceneSearcher, "报酬");
// ---- Step 2: 更新文档 ----
System.out.println("\n【更新文档】");
Document updatedDoc = new Document();
updatedDoc.setId(1);
updatedDoc.setContent("平台客服工具:是指拼多多平台开发并向商家提供的功能或工具,商家通过其专属账号登录平台客服工具后,可以与平台消费者取得\n" +
"联系并为消费者提供客户服务2");
boolean updateSuccess = luceneSearcher.updateDocument(updatedDoc);
System.out.println("更新文档结果:" + (updateSuccess ? "成功" : "失败"));
// 查询更新后的结果
testSearch(luceneSearcher, "消费者");
// ---- Step 3: 删除文档 ----
System.out.println("\n【删除文档】");
boolean deleteSuccess = luceneSearcher.deleteDocument(2);
System.out.println("删除文档结果:" + (deleteSuccess ? "成功" : "失败"));
// 查询删除后的结果
testSearch(luceneSearcher, "报酬");
}
// 封装一个搜索方法,打印搜索结果
private static void testSearch(LuceneSearcher searcher, String keyword) {
List<com.easyagents.core.document.Document> results = searcher.searchDocuments(keyword);
if (results.isEmpty()) {
System.out.println("没有找到匹配的文档。");
} else {
System.out.println("找到 " + results.size() + " 个匹配文档:");
for (com.easyagents.core.document.Document doc : results) {
System.out.println("ID: " + doc.getId());
System.out.println("标题: " + doc.getTitle());
System.out.println("内容: " + doc.getContent());
System.out.println("-----------------------------");
}
}
}
}

View File

@@ -0,0 +1,26 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.easyagents</groupId>
<artifactId>easy-agents-search-engine</artifactId>
<version>${revision}</version>
</parent>
<name>easy-agents-search-engine-service</name>
<artifactId>easy-agents-search-engine-service</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.easyagents</groupId>
<artifactId>easy-agents-core</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,35 @@
/*
* Copyright (c) 2023-2026, Easy-Agents (fuhai999@gmail.com).
* <p>
* Licensed 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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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.
*/
package com.easyagents.search.engine.service;
import com.easyagents.core.document.Document;
import java.util.List;
public interface DocumentSearcher {
boolean addDocument(Document document);
boolean deleteDocument(Object id);
boolean updateDocument(Document document);
default List<Document> searchDocuments(String keyword) {
return searchDocuments(keyword, 10);
}
List<Document> searchDocuments(String keyword, int count);
}

View File

@@ -0,0 +1,26 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.easyagents</groupId>
<artifactId>easy-agents-parent</artifactId>
<version>${revision}</version>
</parent>
<name>easy-agents-search-engine</name>
<artifactId>easy-agents-search-engine</artifactId>
<packaging>pom</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<modules>
<module>easy-agents-search-engine-service</module>
<module>easy-agents-search-engine-es</module>
<module>easy-agents-search-engine-lucene</module>
</modules>
</project>