我在这里实现基本的弹性搜索功能。我经历了一些例子,但无法弄清楚可能出现的问题。应用程序构建正常,但返回空结果..
如果您在我的配置或搜索检索中发现任何错误,请告诉我。
ElasticSearch config:
@Configuration
@EnableElasticsearchRepositories(basePackages = "challenge.repository")
public class ElasticConfiguration {
@Bean
public NodeBuilder nodeBuilder() {
return new NodeBuilder();
}
@Bean
public ElasticsearchOperations elasticsearchTemplate() throws IOException {
File tmpDir = File.createTempFile("elastic", Long.toString(System.nanoTime()));
System.out.println("Temp directory: " + tmpDir.getAbsolutePath());
Settings.Builder elasticsearchSettings =
Settings.settingsBuilder()
.put("http.enabled", "true") // 1
.put("index.number_of_shards", "1")
.put("path.data", new File(tmpDir, "data").getAbsolutePath()) // 2
.put("path.logs", new File(tmpDir, "logs").getAbsolutePath()) // 2
.put("path.work", new File(tmpDir, "work").getAbsolutePath()) // 2
.put("path.home", tmpDir); // 3
return new ElasticsearchTemplate(nodeBuilder()
.local(true)
.settings(elasticsearchSettings.build())
.node()
.client());
}
}
当我尝试搜索与文本之间匹配的内容时,下面是我实现的SearchQueryBuilder:
@Component
public class MessageSearchQueryBuilder {
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
public List<Messages> getAllMessages(String text) {
QueryBuilder query = QueryBuilders.boolQuery()
.should(
QueryBuilders.queryStringQuery(text)
.lenient(true)
.field("content")
).should(QueryBuilders.queryStringQuery("*" + text + "*")
.lenient(true)
.field("content"));
NativeSearchQuery build = new NativeSearchQueryBuilder()
.withQuery(query)
.build();
List<Messages> messages = elasticsearchTemplate.queryForList(build, Messages.class);
return messages;
}
}
下面是将数据加载到存储库的Loader类:
@Component
public class MessageLoader {
@Autowired
ElasticsearchOperations operations;
@Autowired
MessagesRepository messagesRepository;
@Autowired
MessageServiceImpl messageServiceImpl;
@PostConstruct
@Transactional
public void loadAll(){
operations.putMapping(Messages.class);
System.out.println("Loading Data");
messagesRepository.save(getData());
System.out.println(getData());
System.out.printf("Loading Completed");
}
private List<Messages> getData() {
// Principal principal = SecurityContextHolder.getContext().getAuthentication();
return messageServiceImpl.getMyMessagesForSearch(2);//Integer.valueOf(principal.getName()));
}
}
消息模型:
@Document(indexName = "messages", type = "messages", shards = 1)
public class Messages {
@Id
private int id;
private int personId;
private String content;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getPersonId() {
return personId;
}
public void setPersonId(int personId) {
this.personId = personId;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "Messages [id=" + id + ", personId=" + personId + ", content="
+ content + "]";
}
}
我有一个名为findByContent的方法,但我没有在任何地方使用它,因为我有自己的searchQueryBuilder ..这有什么不对吗?
以下是我的存储库:
public interface MessagesRepository extends ElasticsearchRepository<Messages, Long> {
List<Messages> findByContent(String text);
}
以下是我的restAPI,它会检索搜索结果:
@RestController
@RequestMapping("/rest/api/1.0/messages/search")
public class MessageSearchController {
@Autowired
private MessageSearchQueryBuilder messageSearchQueryBuilder;
@GetMapping(value = "/{text}", produces = MediaType.APPLICATION_JSON_VALUE)
public List<Messages> getAllMessages(@PathVariable final String text) {
return messageSearchQueryBuilder.getAllMessages(text);
}
}
我找不到任何关于我在获取匹配搜索结果时出错的线索。任何帮助就像上帝的礼物。