Cześć!
Postanowiłem, że postaram się stworzyć projekt - aplikację webową - w której użyje modułu wyszukiwarki umiejscowionej na stronie do przeszukiwania mojej bazy danych, a dokładnie tabelę składowanych Artykułów. Jako że korzystam ze spring data w projekcie, to założyłem że użyję silnika ElasticSearch do tego celu. Dodatkowo, w przyszłości chcę połączyć wyszukiwanie po tytułach wraz z wyszukiwaniem w tagach(tagi takie jak na przykład na tym forum)
Pierwszym, zasadniczym pytaniem jest: Czy jest to dobry wybór do tego typu modułu? A jeśli tak, to by nie tworzyć drugiego wątku przedstawie wam problem który mam z danym rozwiązaniem, mianowicie zapytanie mapowane w kontrolerze(przedstawione na końcu) zwraca mi JSONa z takim błędem:
"message": "None of the configured nodes are available: [{#transport#-1}{xzi23OqRRiyfmIs1jhxaow}{127.0.0.1}{127.0.0.1:9300}]"
A o to w jaki sposób i co dokładnie próbuje (przynajmniej w moim założeniu) uzyskać:
Za pomocą wpisania słowa kluczowego próbuję znaleźć tytuł artykułu w bazie danych, która takie słowo kluczowe posiada.
Moje wypociny w kodzie:
Klasa konfiguracyjna silnika ElasticSearch
public class EsConfig {
@Value("${elasticsearch.home:/usr/local/Cellar/elasticsearch/5.6.0}")
private String elasticsearchHome;
@Value("${elasticsearch.cluster.name:elasticsearch}")
private String clusterName;
@Bean
public Client client() {
Settings elasticsearchSettings = Settings.builder()
.put("client.transport.sniff", true)
.put("path.home", elasticsearchHome)
.put("cluster.name", clusterName).build();
TransportClient client = new PreBuiltTransportClient(elasticsearchSettings);
try {
client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
}catch (UnknownHostException e){
e.printStackTrace();
}
return client;
}
@Bean
public ElasticsearchOperations elasticsearchTemplate() {
return new ElasticsearchTemplate(client());
}
}
Implementacja repozytorium rozszerzające standardowe repozytorium któro wygląda tak:
@Component
class ElasticSearchRepositoryImpl {
EsConfig esConfig;
ElasticSearchRepositoryImpl(EsConfig esConfig){
this.esConfig=esConfig;
}
List<Article> findArticleByKeyWord(String whereToSearch,String whatToSearch) {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withFilter(regexpQuery(whereToSearch, ".*" + whatToSearch + "*."))
.build();
ElasticsearchOperations elasticsearchOperations = esConfig.elasticsearchTemplate();
return elasticsearchOperations.queryForList(searchQuery, Article.class);
}
}
Metoda ta odbierana jest przez prostą fasadę, która następnie pobierana jest w metodzie kontrolera:
@GetMapping(value = "/search/{keyWord}")
ResponseEntity getArticlesByTitleKeyWord(@PathVariable(value = "keyWord")String keyWord) {
return new ResponseEntity<>(searchFacade.searchArticlesByKeyWord("title",keyWord),HttpStatus.OK);
}
Z góry dzięki za pomoc!