Введение
С недавнего времени хочу получить функцию поиска на сайте.До этого я изучил Lucene, а потом услышал термин Solr. Затем я открыл для себя Elasticsearch, когда узнал о полнотекстовом поиске, который также основан на Lucene.
Я искал несколько руководств по Elasticsearch и обнаружил, что многие из них основаны на Linux, но я не знаком с Linux и редко его использую. Я знаю только несколько простых команд, и я буду есть их медленно, когда действительно буду использовать Linux.
Итак, я нашел хорошо написанный учебник:
Первый — это установка Elasticsearch, о которой также упоминается в приведенном выше туториале, и приведен скрипт для установки в один клик. Здесь используется для записи моего личного процесса установки.
PS: Обновление в 18:58:12 от 22.03.2018: Больше не рекомендую устанавливать Elasticsearch под Windows, т. к. установка по-прежнему хлопотная, и много мелких проблем~ (Также есть процесс настройки Elasticsearch под линуксом позже. , для изучения Elasticsearch рекомендуется использовать среду linux (если студент рекомендует купить сервер, есть скидка), если очень не хочется платить, можно использовать виртуальную машину~
2. Установите Elasticsearch под Windows (не рекомендуется)
2.1 Установите эластичный поиск
Установите Elasticsearch для работы в качестве оконной службы,Его данная версия 2.3.3. Так я тоже пошел ставить 2.3.3.
Вы можете найти соответствующую версию в поисковой строке на официальном сайте.
Для запуска в качестве службы Windows ссылка, указанная в руководстве, не работает. я нашел один
блог woo woo woo.cn на.com/через IU/afraid/571…
2.2 Установка головки
Установить головной плагин очень просто, перейдите в соответствующий каталог и используйте следующую команду:
plugin install mobz/elasticsearch-head
2.3 Установите плагины kibana и Logstash для запуска в качестве сервисов
Приведенная ссылка представляет собой вопрос в stackOverFlow и видео на Youtobe. stackOverFlow не может решить проблему моего процесса установки, youtobe не подключен к внешней сети, и я не могу войти.
Позже я нашел еще один учебник, и он прошел очень гладко:
сегмент fault.com/ah/119000001…
Версия, загруженная Logstash: 2.3.3 соответствует Elasticsearch.
Версия для загрузки kibana: 4.5.0
Может возникнуть следующая ситуация, указывающая на то, что установка прошла успешно
2.4 Установка щита
plugin install license
plugin install shield
Перезагрузитесь, затем выполните:
Добавить администратора
bin/shield/esusers useradd adminName -r admin
добавить пользователя для кибаны
esusers useradd kibanaserver -r kibana4_server
В его конфигурации (kibana.yml) добавьте:
kibana_elasticsearch_username: kibanaserver #Kibana服务将用这个用户名访问ElasticSearch服务器。
kibana_elasticsearch_password: zhongfucheng #密码
Вы можете войти в систему, только если у вас настроена учетная запись kibanaserver.
2.5 Установите токенизатор
Используется соединение, указанное в этом руководстве Мой основной скриншот:
Версия ik tokenizer 1.9.3. В статье дан пакет и загрузка в виде mvn. Таким образом, вВ github качаем тип ресурса.
При распаковке zip распаковывается в текущий файл, а данные conf берутся в исходный файл (исключая папку!)
2.6 Токенизатор пиньинь
Я загрузил сегментатор китайских слов раньше, и я также нашел сегментатор слов пиньинь, когда я смотрел учебник позже.Установка сегментатора слов пиньинь очень похожа на установку сегментатора китайских слов.
Версия токенизатора пиньинь, соответствующая Elasticsearch версии 2.3.3: 1.7.3.
Это конец загрузки Elasticsearch для Windows.
3. Установите Elasticsearch под Linux
Это моя заметка, когда я создаю проект,
3.1 Скачать Elasticsearch
Загрузка Elasticsearch по-прежнему очень удобна, предоставляя поиск для загрузки. Я не буду размещать ссылку здесь. Просто зайдите на официальный сайт, чтобы найти его. Или зайдите в мой журнал обучения Elasticsearch, чтобы найти его.
Я загрузил версию 2.3.3, потому что я также загрузил версию 2.3.3, когда разрабатывал для Windows, просто для последовательности.
3.2 Установите Elasticsearch
tar -xzvf elasticsearch-2.3.3.tar.gz
Просто переключитесь в каталог bin и выполните его...
Вам нужно выполнить elasticsearch следующим образом, если вы используете пользователя root
./elasticsearch -d -Des.insecure.allow.root=true
Теперь используйте следующий оператор, чтобы получить информацию
curl -X GET 'http://localhost:9200'
Если вы хотите получить доступ через внешнюю сеть, то вам необходимо изменить файл конфигурации, перейдите по ссылкеblog.CSDN.net/U012599988/…
Также откройте порт на сервере ESC для доступа:
3.2.1 Загрузите головной плагин
При скачивании головного плагина нужно изменить пользователя и группу elasticsearch, иначе не даст скачать. Команда выглядит следующим образом
Добавьте пользователей и группы
groupadd elasticsearch
useradd elasticsearch -g elasticsearch -p 123456
Изменить права доступа к папке
chown -R elasticsearch:elasticsearch elasticsearch-2.3.3
После этого вы можете выполнить команду для загрузки головного плагина.
./plugin install mobz/elasticsearch-head
После загрузки головного плагина не качайте сразу плагин щита, сначала создайте индекс для головного плагина!
В противном случае при загрузке подключаемого модуля щита и повторном обращении к подключаемому модулю головы узел не может быть подключен!
Я долго разбирался!!!!!В интернете тоже много людей которые сталкивались с такой ситуацией,но толкового ответа нет. Все дело в конфигурационном файле.
Я нашел ответ, просмотрев вопросы, поднятые другими в github. Ссылка: https://github.com/mobz/elasticsearch-head/issues/191#issuecomment-132636493
Помните, сначала создайте индекс в головном плагине, а затем загрузите плагин щита, иначе нельзя будет подключить головной плагин!
3.2.2 Экран разрешения загрузки
Скачал шилд при разработке под windows, для последовательности тоже скачаю.
введите команду:
plugin install license
plugin install shield
После загрузки настройте пользователя администратора
bin/shield/esusers useradd adminName -r admin
Если в статье есть какие-либо ошибки, пожалуйста, поправьте меня, и мы сможем общаться друг с другом.Учащиеся, которые привыкли читать технические статьи в WeChat и хотят получить больше ресурсов по Java, могут подписаться на общедоступную учетную запись WeChat: Java3y.
4. РЕСТ API
В предыдущей главе вы загрузили Elasticsearch и его различные подключаемые модули, которые обычно используются. После понимания соответствующих концепций мы должны начать выяснять, как используется Elasticsearch.
Ссылка на ссылку:
Я следовал этому руководству, чтобы пройтись по REST API, и постепенно понял основные моменты Elasticsearch.
Эй, один я сто.ком / резинка это УХО...
5. ЯВА API
В конце концов, мы используем Java, поэтому нам нужно знать, как связаны Elasticsearch и Java. Я нашел несколько уроков:
блог woo woo woo.cn on.com/textRon K/afraid/…
Блог Woo Woo.cn на.com/TuTu21 на всю жизнь/Боюсь…
Позже я нашел более систематический учебник и рекомендую это:
blog.CSDN.net/На По Я Яо/ Арети…
Я также следил за учебником, чтобы написать демо, и в нем было много ошибок. Вставьте код:
import com.carrotsearch.hppc.cursors.ObjectObjectCursor;
import org.elasticsearch.action.admin.indices.close.CloseIndexResponse;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
import org.elasticsearch.action.admin.indices.exists.types.TypesExistsResponse;
import org.elasticsearch.action.admin.indices.open.OpenIndexResponse;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.deletebyquery.DeleteByQueryAction;
import org.elasticsearch.action.deletebyquery.DeleteByQueryRequestBuilder;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.get.MultiGetItemResponse;
import org.elasticsearch.action.get.MultiGetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.cluster.metadata.MappingMetaData;
import org.elasticsearch.common.collect.ImmutableOpenMap;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.script.Script;
import org.elasticsearch.script.ScriptService;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.shield.ShieldPlugin;
import org.junit.Test;
import java.io.*;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.List;
import java.util.concurrent.ExecutionException;
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
import org.elasticsearch.client.transport.TransportClient;
/**
* Created by ozc on 2017/11/5.
*/
public class ElasticsearchDemo {
/**
* 创建
* @throws UnknownHostException
*/
@Test
public void CreateIndex() throws UnknownHostException {
//连接客户端
Client client = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
//将数据转成json字符串,用集合装载起来
List<String> jsonData = DataFactory.getInitJsonData();
//创建blog索引、article类型、数据是上边的json字符串
for (int i = 0; i < jsonData.size(); i++) {
IndexResponse response = client.prepareIndex("blog", "article","1").setSource(jsonData.get(i)).get();
if (response.isCreated()) {
System.out.println("创建成功!");
}
}
client.close();
}
/**
* 查询
* @throws UnknownHostException
*/
@Test
public void selectIndex() throws UnknownHostException {
Settings settings = Settings.settingsBuilder()
.put("cluster.name", "elasticsearch")
.put("shield.user", "zhongfucheng:zhongfucheng")
.build();
TransportClient client = TransportClient.builder()
.addPlugin(ShieldPlugin.class)
.settings(settings).build();
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
//查询title字段中包含hibernate关键字的文档
QueryBuilder qb1 = termQuery("title", "hibernate");
//查询title字段或content字段中包含git关键字的文档:
QueryBuilder qb2= QueryBuilders.multiMatchQuery("git", "title","content");
SearchResponse response = client.prepareSearch("blog").setTypes("article").setQuery(qb2).execute()
.actionGet();
SearchHits hits = response.getHits();
if (hits.totalHits() > 0) {
for (SearchHit hit : hits) {
System.out.println("score:"+hit.getScore()+":\t"+hit.getSource());// .get("title")
}
} else {
System.out.println("搜到0条结果");
}
}
/**
* 使用updateRequest更新
* @throws IOException
* @throws ExecutionException
* @throws InterruptedException
*/
@Test
public void update1() throws IOException, ExecutionException, InterruptedException {
//连接客户端
Client client = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
UpdateRequest uRequest = new UpdateRequest();
uRequest.index("blog");
uRequest.type("article");
uRequest.id("1");
uRequest.doc(jsonBuilder().startObject().field("content", "学习目标 掌握java泛型的产生意义ssss").endObject());
client.update(uRequest).get();
}
/**
* 使用脚本更新,需要更改配置文件【我不喜欢用】
* @throws IOException
* @throws ExecutionException
* @throws InterruptedException
*/
@Test
public void update2() throws IOException, ExecutionException, InterruptedException {
//连接客户端
Client client = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
client.prepareUpdate("blog", "article", "1")
.setScript(new Script("ctx._source.title = \"git入门\"", ScriptService.ScriptType.INLINE, null, null))
.get();
}
/**
* 使用doc更新
* @throws IOException
* @throws ExecutionException
* @throws InterruptedException
*/
@Test
public void update3() throws IOException, ExecutionException, InterruptedException {
//连接客户端
Client client = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
client.prepareUpdate("blog", "article", "1")
.setDoc(jsonBuilder().startObject().field("content", "SVN与Git对比222222。。。").endObject()).get();
}
/**
* 使用updateRequest更新、能够新增新字段
* @throws IOException
* @throws ExecutionException
* @throws InterruptedException
*/
@Test
public void update4() throws IOException, ExecutionException, InterruptedException {
//连接客户端
Client client = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
UpdateRequest updateRequest = new UpdateRequest("blog", "article", "1")
.doc(jsonBuilder().startObject().field("commet", "0").endObject());
client.update(updateRequest).get();
}
/**
* 使用UpdateRequest更新, 如果文档不存在则创建新的索引
* @throws IOException
* @throws ExecutionException
* @throws InterruptedException
*/
@Test
public void update5() throws IOException, ExecutionException, InterruptedException {
//连接客户端
Client client = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
IndexRequest indexRequest = new IndexRequest("blog", "article", "10").source(jsonBuilder().startObject()
.field("title", "Git安装10").field("content", "学习目标 git。。。10").endObject());
UpdateRequest uRequest2 = new UpdateRequest("blog", "article", "10").doc(
jsonBuilder().startObject().field("title", "Git安装").field("content", "学习目标 git。。。").endObject())
.upsert(indexRequest);
client.update(uRequest2).get();
}
/**
* 删除具体的索引值
* @throws IOException
* @throws ExecutionException
* @throws InterruptedException
*/
@Test
public void deleteSpecificIndex() throws IOException, ExecutionException, InterruptedException {
//连接客户端
Client client = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
DeleteResponse dResponse = client.prepareDelete("blog", "article", "10").execute()
.actionGet();
if (dResponse.isFound()) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
}
/**
* 根据index名称 删除整个索引库
* @throws IOException
* @throws ExecutionException
* @throws InterruptedException
*/
@Test
public void deleteIndex() throws IOException, ExecutionException, InterruptedException {
//要删除索引库的名字
String indexName = "zhognfucheng";
if (!isIndexExists(indexName)) {
System.out.println(indexName + " not exists");
} else {
Client client = TransportClient.builder().build().addTransportAddress(
new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),
9300));
DeleteIndexResponse dResponse = client.admin().indices().prepareDelete(indexName)
.execute().actionGet();
if (dResponse.isAcknowledged()) {
System.out.println("delete index "+indexName+" successfully!");
}else{
System.out.println("Fail to delete index "+indexName);
}
}
}
// 创建索引库
@Test
public void createIndex() {
//要创建索引库的名称
String indexName = "shcool";
try {
Client client = TransportClient.builder().build().addTransportAddress(
new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
// 创建索引库
if (isIndexExists(indexName)) {
System.out.println("Index " + indexName + " already exits!");
} else {
CreateIndexRequest cIndexRequest = new CreateIndexRequest(indexName);
CreateIndexResponse cIndexResponse = client.admin().indices().create(cIndexRequest)
.actionGet();
if (cIndexResponse.isAcknowledged()) {
System.out.println("create index successfully!");
} else {
System.out.println("Fail to create index!");
}
}
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
/**
* 批量从Elasticsearch导出json到文件中
*/
@Test
public void ElasticSearchBulkOut() {
try {
//初始化
Settings settings = Settings.settingsBuilder()
.put("cluster.name", "elasticsearch").build();// cluster.name在elasticsearch.yml
//连接客户端
Client client = TransportClient.builder().settings(settings).build()
.addTransportAddress(new InetSocketTransportAddress(
InetAddress.getByName("127.0.0.1"), 9300));
//匹配所有查询
QueryBuilder qb = QueryBuilders.matchAllQuery();
SearchResponse response = client.prepareSearch("blog")
.setTypes("article").setQuery(qb)
.execute().actionGet();
//获取命中记录
SearchHits resultHits = response.getHits();
//遍历命中记录,写到文件中
File article = new File("C:\\ElasticsearchDemo\\src\\java\\file\\bulk.txt");
FileWriter fw = new FileWriter(article);
BufferedWriter bfw = new BufferedWriter(fw);
if (resultHits.getHits().length == 0) {
System.out.println("查到0条数据!");
} else {
for (int i = 0; i < resultHits.getHits().length; i++) {
String jsonStr = resultHits.getHits()[i]
.getSourceAsString();
System.out.println(jsonStr);
bfw.write(jsonStr);
bfw.write("\n");
}
}
bfw.close();
fw.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 批量导入到Elasticsearch中
*/
@Test
public void ElasticSearchBulkInput() {
try {
Settings settings = Settings.settingsBuilder()
.put("cluster.name", "elasticsearch").build();// cluster.name在elasticsearch.yml中配置
Client client = TransportClient.builder().settings(settings).build()
.addTransportAddress(new InetSocketTransportAddress(
InetAddress.getByName("127.0.0.1"), 9300));
File article = new File("C:\\ElasticsearchDemo\\src\\java\\file\\bulk.txt");
FileReader fr=new FileReader(article);
BufferedReader bfr=new BufferedReader(fr);
String line = null;
BulkRequestBuilder bulkRequest=client.prepareBulk();
int count=0;
while((line=bfr.readLine())!=null){
bulkRequest.add(client.prepareIndex("test","article").setSource(line));
if (count%10==0) {
bulkRequest.execute().actionGet();
}
count++;
//System.out.println(line);
}
bulkRequest.execute().actionGet();
bfr.close();
fr.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 根据名称判断索引是否存在
* @param indexName
* @return
*/
public boolean isIndexExists(String indexName) {
boolean flag = false;
try {
Client client = TransportClient.builder().build().addTransportAddress(
new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
IndicesExistsRequest inExistsRequest = new IndicesExistsRequest(indexName);
//下面可判断多个索引名称是否存在
//IndicesExistsResponse indexResponse = client.admin().indices().prepareExists("blog","blog1").execute().actionGet();
IndicesExistsResponse inExistsResponse = client.admin().indices()
.exists(inExistsRequest).actionGet();
if (inExistsResponse.isExists()) {
flag = true;
} else {
flag = false;
}
} catch (UnknownHostException e) {
e.printStackTrace();
}
return flag;
}
/**
* 删除type下的所有文档
* 也就是类似关系型数据库中根据表删除所有记录
*
* ps(需要下载插件plugin install delete-by-query)和导入pom包
*
* ps(使用的是windows服务的方式运行Elastic,因此需要在bin目录下的使用service重启,不然就会报空指针异常!
*/
@Test
public void deleteByQuery() throws UnknownHostException {
Client client = TransportClient.builder().build().addTransportAddress(
new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
String deletebyquery = "{\"query\": {\"match_all\": {}}}";
DeleteByQueryRequestBuilder response = new DeleteByQueryRequestBuilder(client,DeleteByQueryAction.INSTANCE);
response.setIndices("blog").setTypes("article").setSource(deletebyquery)
.execute()
.actionGet();
}
//-------------------------------------------------------------------
/**
* Java三层嵌套查询,我感觉是用得很少的。贴个链接把:
* http://blog.csdn.net/napoay/article/details/52060659
* <p>
* 搜索有相同父id的子文档,我也感觉用得少。贴个链接吧:
* http://blog.csdn.net/napoay/article/details/52118408
*
* 集群配置,现在用不上。贴个链接吧:
* http://blog.csdn.net/napoay/article/details/52202877
*/
//-------------------------------------------------------------------
/**
* 删除index为blog、类型为article、id为1的索引中的id属性
* (需要在配置文件中添加以下内容),否则会出现异常
*
* script.inline: on
script.indexed: on
script.engine.groovy.inline.aggs: on
*
* @throws UnknownHostException
*/
@Test
public void deleteField() throws UnknownHostException {
Client client = TransportClient.builder().build().addTransportAddress(
new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
client.prepareUpdate("blog", "article", "1").setScript(new Script("ctx._source.remove(\"title\")",ScriptService.ScriptType.INLINE, null, null)).get();
//删除属性中的属性
//client.prepareUpdate("test", "document", "1").setScript(new Script( "ctx._source.processInstance.remove(\"id\")",ScriptService.ScriptType.INLINE, null, null)).get();
}
/**
* 添加了Elasticsearch安全插件以后,连接cliet的方式就要改变了。
*
* 网站给的maven坐标根本找不到,只能下载了个jar包用了。
*
* 配置了Elasticsearch认证以后,kibana也需要配置,不然进不去的。
*
* 链接:
* http://blog.csdn.net/sd4015700/article/details/50427852
*
* 当前配置的Elasticsearch zhongfucheng:zhongfucheng
* 当前配置的kibana kibanaserver:zhongfucheng (ps:此部分还需要修改配置文件,详情看上边的连接)
*
*/
@Test
public void changeClient() throws UnknownHostException {
Settings settings = Settings.settingsBuilder()
.put("cluster.name", "elasticsearch")
.put("shield.user", "zhongfucheng:zhongfucheng")
.build();
TransportClient client = TransportClient.builder()
.addPlugin(ShieldPlugin.class)
.settings(settings).build();
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
System.out.println(client);
}
/**
* 判断类型是否存在
* @throws UnknownHostException
*/
@Test
public void isTypeExists() throws UnknownHostException {
Settings settings = Settings.settingsBuilder()
.put("cluster.name", "elasticsearch")
.put("shield.user", "zhongfucheng:zhongfucheng")
.build();
TransportClient client = TransportClient.builder()
.addPlugin(ShieldPlugin.class)
.settings(settings).build();
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
// bolg是index、article是类型
TypesExistsResponse typeResponse = client.admin().indices()
.prepareTypesExists("blog").setTypes("article")
.execute().actionGet();
System.out.println(typeResponse.isExists());
}
/**
* 关闭索引
*/
@Test
public void closeIndex() throws UnknownHostException {
Settings settings = Settings.settingsBuilder()
.put("cluster.name", "elasticsearch")
.put("shield.user", "zhongfucheng:zhongfucheng")
.build();
TransportClient client = TransportClient.builder()
.addPlugin(ShieldPlugin.class)
.settings(settings).build();
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
CloseIndexResponse cIndexResponse = client.admin().indices().prepareClose("shcool")
.execute().actionGet();
if (cIndexResponse.isAcknowledged()) {
System.out.println("关闭索引成功");
}
}
/**
* 打开索引
* @throws UnknownHostException
*/
@Test
public void openIndex() throws UnknownHostException {
Settings settings = Settings.settingsBuilder()
.put("cluster.name", "elasticsearch")
.put("shield.user", "zhongfucheng:zhongfucheng")
.build();
TransportClient client = TransportClient.builder()
.addPlugin(ShieldPlugin.class)
.settings(settings).build();
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
OpenIndexResponse oIndexResponse = client.admin().indices()
.prepareOpen("shcool")
.execute().actionGet();
System.out.println(oIndexResponse.isAcknowledged());
}
/**
* 获取文档的集合
* 可以获取同一索引、同一类型、不同id的文档集合
* 也可以获取不同索引、不同类型、不同id的文档集合
*/
@Test
public void getDocCollection() throws UnknownHostException {
Settings settings = Settings.settingsBuilder()
.put("cluster.name", "elasticsearch")
.put("shield.user", "zhongfucheng:zhongfucheng")
.build();
TransportClient client = TransportClient.builder()
.addPlugin(ShieldPlugin.class)
.settings(settings).build();
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
MultiGetResponse multiGetItemResponses = client.prepareMultiGet()
.add("blog", "article", "1") //注释1
//.add("twitter", "tweet", "2", "3", "4") //注释2
.add("test", "article", "AV-K5x1NAQtVzQCf247Q") //注释3
.get();
for (MultiGetItemResponse itemResponse : multiGetItemResponses) { //注释4
GetResponse response = itemResponse.getResponse();
if (response.isExists()) { //注释5
String json = response.getSourceAsString(); //注释6
System.out.println(json);
}
}
/**
注释1: 通过单一的ID获取一个文档.
注释2:传入多个id,从相同的索引名/类型名中获取多个文档.
注释3:可以同时获取不同索引中的文档.
注释4:遍历结果集.
注释5:检验文档是否存在.
注释6:获取文档源.
*/
}
/**
* 获取索引下每个Type和Mapping
* @throws IOException
*/
@Test
public void getIndexTypeAndMapping() throws IOException {
Settings settings = Settings.settingsBuilder()
.put("cluster.name", "elasticsearch")
.put("shield.user", "zhongfucheng:zhongfucheng")
.build();
TransportClient client = TransportClient.builder()
.addPlugin(ShieldPlugin.class)
.settings(settings).build();
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
ImmutableOpenMap<String, MappingMetaData> mappings = client.admin().cluster().prepareState().execute()
.actionGet().getState().getMetaData().getIndices().get("blog").getMappings();
for (ObjectObjectCursor<String, MappingMetaData> cursor : mappings) {
System.out.println(cursor.key); // 索引下的每个type
System.out.println(cursor.value.getSourceAsMap()); // 每个type的mapping
}
}
/**
*
* Elasticsearch还有分析聚合这么一个功能,类似与Mysql中的分组函数、统计数据。
* 贴个链接:
*
* http://blog.csdn.net/napoay/article/details/53484730
*/
}
Приведенный выше код предназначен для:blog.CSDN.net/На По Я Яо/ Арети…уже.
При отработке демонстрации возникает несколько проблем:
- Используя защищенную аутентификацию, координаты maven не могут быть загружены, можно импортировать только пакеты jar (официальные координаты maven не могут быть найдены.... щит заброшен)
- После использования защищенной аутентификации ** код подключения ElasticSearch, указанный блоггером выше, неверен, и возникает исключение. **Я нашел несколько информации в Интернете, но не могу решить свою проблему:
- blog.CSDN.net/Шаньдун 4015700/Ах…
- blog.CSDN.net/Luyuan1234/…
- Наконец нашел ответ в сообщении в блоге:Обновите код для подключения к Elasticsearch.
Settings settings = Settings.settingsBuilder()
.put("cluster.name", "elasticsearch")
.put("shield.user", "zhongfucheng:zhongfucheng")
.build();
TransportClient client = TransportClient.builder()
.addPlugin(ShieldPlugin.class)
.settings(settings).build();
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
6. Резюме
Я просто использовал Elasticsearch в своем личном проекте, и столкнулся с массой подводных камней, таких как: при создании Elasticsearch Client обязательно добавить такую конфигурацию, как sniffing:.put("client.transport.sniff", true)
, иначе Elasticsearch будет очень и очень застревать при его использовании, что просто подозрительно по жизни.
В то время я использовал Elasticsearch для выполнения функции автоматического завершения, которая выглядит следующим образом:
Elasticsearch имеет функцию автоматического запроса (завершения), такую как предложение, см. сообщение в блоге:
blog.CSDN.net/а именно Пэн/art…
Ву Ву. Job-hopping.net/article/86. …
Конкретные операции:
- Создайте такое поле, которое автоматически заполняется при создании сопоставления, и установите следующее сопоставление
//自动补全属性--------
.startObject("suggestName")
.field("type", "completion")
.field("analyzer", "standard")
.field("payloads", "true")
.endObject()
//自动补全属性结束--------
Когда пользователь добавляет новую запись индекса, поле автозаполнения является нашим ключевым полем.
public static String String2JSON(String... strings) throws IOException {
String suggestName = strings[2];
if (suggestName.length() > 0) {
}
XContentBuilder builder = jsonBuilder()
.startObject()
.field("userId", strings[0])
.field("webSiteAddr", strings[1])
.field("webSiteName", strings[2])
//自动补全字段
.field("suggestName", strings[2])
.endObject();
return builder.string();
}
Другие основные вещи на самом деле произошли от Lucene.Если вы еще не изучили Lucene, вы можете перейти к другому моему сообщению в блоге:
Если в статье есть какие-либо ошибки, пожалуйста, поправьте меня, и мы сможем общаться друг с другом.Учащиеся, которые привыкли читать технические статьи в WeChat и хотят получить больше ресурсов по Java, могут подписаться на общедоступную учетную запись WeChat: Java3y.