Spring boot elasticsearch返回空结果

时间:2018-01-17 15:58:24

标签: spring spring-boot spring-data spring-data-elasticsearch

我在这里实现基本的弹性搜索功能。我经历了一些例子,但无法弄清楚可能出现的问题。应用程序构建正常,但返回空结果..

如果您在我的配置或搜索检索中发现任何错误,请告诉我。

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);
    }
}

我找不到任何关于我在获取匹配搜索结果时出错的线索。任何帮助就像上帝的礼物。

0 个答案:

没有答案