স্প্রিং বুট এর সাথে ইলাস্টিক সার্চ

elasticsearchspring-boot

 কোন একটা টপিককে ট্যাগ দিয়ে সহজেই ট্যাগ সার্চ ইমপ্লিমেন্ট করা যায়। কিন্তু কতগুলা ট্যাগ বসাবো? যদি একটা কন্টেন্টের যেকোন শব্দের উপর সার্চ করতে চাই তাহলে সোলার বা ইলাস্টিক সার্চ এক্ষেত্রে চমৎকার কাজ করে।



স্প্রিং বুটের সাথে কোন ভার্সনের ইলাস্টিক সার্চ ব্যবহার করতে হবে তার জন্য একটা ম্যাপ আছে, স্প্রিং বুট ২ ব্যবহার করায়, আমি কোন ভাবেই ইলাস্টিক ৫ এর উপর যেতে পারবোনা। ইলাস্টিক ৫ (https://www.elastic.co/blog/elasticsearch-5-6-0-released) ডাউনলোড করে ফেললাম



ইলাস্টিক রান করা


ইলাস্টিক রান করা সহজ, রুট ফোল্ডারে দিয়ে নিচের কমান্ড দিলে 9200, 9300 পোর্টে ইলাস্টিক চলা শুরু করে।

cd elasticsearch-5.6.0
./bin/elasticsearch     




ব্রাউজারে ইলাস্টিক ব্রাউজ করার জন্য ElasticSearch Head(https://chrome.google.com/webstore/detail/elasticsearch-head/ffmkiejjmecolpfloofpjologoblkegm)এর ক্রোমের এক্সটেনশন আছে। জাস্ট ইন্সটল করলেই হয়ে যায়।



নিচে স্প্রিং বুটের জন্য কনফিগার দেয়া হলো



১. ডিপেন্ডেন্সি যুক্ত করলাম

<!-- elastic search -->
<dependency>
   <groupId>org.springframework.data</groupId>
   <artifactId>spring-data-elasticsearch</artifactId>
</dependency>

<dependency>
   <groupId>org.elasticsearch.client</groupId>
   <artifactId>transport</artifactId>
</dependency>

<dependency>
   <groupId>org.elasticsearch.plugin</groupId>
   <artifactId>transport-netty4-client</artifactId>
</dependency>
<!-- // elastic search -->



২. ডকুমেন্ট বানালাম

@Document(indexName = "hypermemory", type = "topic")
public class Topic {


    @Id 
    protected String id;

    @NotNull
    @Size(max = 100)
    private String name;

    @Size(max = 150)
    private String title;

    @Size(max = 250)
    private String description;

}



৩. রিপোসিটোরি বানালাম

public interface TopicElasticRepository extends ElasticsearchRepository<Topic, String> {
}



৪. সার্ভিস লিখলাম

@Service
@RequiredArgsConstructor
public class TopicServiceImpl implements TopicService{

    private final  TopicJPARepository topicDBRepository;

    private final TopicElasticRepository topicElasticRepository;

    @Override
    public Topic create(Topic topic) {
        Topic saveTopic = topicDBRepository.save(topic);
        topicElasticRepository.save(saveTopic);
        return saveTopic;
    }


তারপর No property index found for type? ইরর পাইতে শুরু করলাম। নিচের সেটিং থেকে সমাধান হলো। আমি যেহেতু JPA রেপোরেটরির সাথে ইলাস্টিক রিপোজিটরি ব্যবহার করার ট্রাই করতেছি, সে জন্য দুটা রিপোজিটোরিকেই ঠিক মতো বলে দিয়ে আসতে হবে।


@SpringBootApplication
@EnableJpaRepositories(basePackages = {"com.maruf.hypermemory"})
@EnableElasticsearchRepositories(basePackages = "com.maruf.hypermemory.repository.elastic")
public class Application {
     ....
}



তারপর আবার ইরোর পাবেন। বিন নাই। টেমপ্লেট বিন তৈরী করতে বলায় একটা তৈরী করে দিলাম

@Configuration
public class ElasticConfig {

    @Bean
    public Client client() {
        Settings elasticsearchSettings = Settings.builder()
                .put("client.transport.sniff", true)
                .put("cluster.name", "elasticsearch").build();

        TransportClient client = new PreBuiltTransportClient(elasticsearchSettings);
        try {
            client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return client;
    }

    @Bean
    public ElasticsearchOperations elasticsearchTemplate() {
        return new ElasticsearchTemplate(client());
    }
}


ব্যাস। এপ্লিকেশন এখন রান করবে আশা করা যায়।