elasticsearch,lucene,Java,elasticsearch,Lucene" /> elasticsearch,lucene,Java,elasticsearch,Lucene" />

Java 在弹性搜索中配置analyzer

Java 在弹性搜索中配置analyzer,java,elasticsearch,lucene,Java,elasticsearch,Lucene,我写了下面的程序来理解如何使用弹性搜索进行全文搜索。在这里,当我搜索单个单词时,它可以正常工作,但我想搜索单词的组合,但这不起作用 package in.blogspot.randomcompiler.elastic_search_demo; import in.blogspot.randomcompiler.elastic_search_impl.Event; import java.util.Date; import org.elasticsearch.action.count.Cou

我写了下面的程序来理解如何使用弹性搜索进行全文搜索。在这里,当我搜索单个单词时,它可以正常工作,但我想搜索单词的组合,但这不起作用

package in.blogspot.randomcompiler.elastic_search_demo;

import in.blogspot.randomcompiler.elastic_search_impl.Event;

import java.util.Date;

import org.elasticsearch.action.count.CountRequestBuilder;
import org.elasticsearch.action.count.CountResponse;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.FilterBuilder;
import org.elasticsearch.index.query.FilterBuilders;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;

import com.fasterxml.jackson.core.JsonProcessingException;

public class ElasticSearchDemo
{
    public static void main( String[] args ) throws JsonProcessingException
    {
        Client client = new TransportClient()
        .addTransportAddress(new InetSocketTransportAddress("localhost", 9301));

        DeleteResponse deleteResponse1 = client.prepareDelete("chat-data", "event", "1").execute().actionGet();
        DeleteResponse deleteResponse2 = client.prepareDelete("chat-data", "event", "2").execute().actionGet();
        DeleteResponse deleteResponse3 = client.prepareDelete("chat-data", "event", "3").execute().actionGet();

        Event e1 = new Event("LOGIN", new Date(), "Agent1 logged into chat");
        String e1Json = e1.prepareJson();        
        System.out.println("JSON: " + e1Json);        
        IndexResponse indexResponse1 = client.prepareIndex("chat-data", "event", "1").setSource(e1Json).execute().actionGet();
        printIndexResponse("e1", indexResponse1);

        Event e2 = new Event("LOGOUT", new Date(), "Agent1 logged out of chat");
        String e2Json = e2.prepareJson();        
        System.out.println("JSON: " + e2Json);        
        IndexResponse indexResponse2 = client.prepareIndex("chat-data", "event", "2").setSource(e2Json).execute().actionGet();
        printIndexResponse("e2", indexResponse2);

        Event e3 = new Event("BREAK", new Date(), "Agent1 went on break in the middle of a chat");
        String e3Json = e3.prepareJson();        
        System.out.println("JSON: " + e3Json);        
        IndexResponse indexResponse3 = client.prepareIndex("chat-data", "event", "3").setSource(e3Json).execute().actionGet();
        printIndexResponse("e3", indexResponse3);

        FilterBuilder filterBuilder = FilterBuilders.termFilter("value", "break middle");

        SearchRequestBuilder searchBuilder = client.prepareSearch();
        searchBuilder.setPostFilter(filterBuilder);

        CountRequestBuilder countBuilder = client.prepareCount();
        countBuilder.setQuery(QueryBuilders.constantScoreQuery(filterBuilder));

        CountResponse countResponse1 = countBuilder.execute().actionGet();
        System.out.println("HITS: " + countResponse1.getCount());


        SearchResponse searchResponse1 = searchBuilder.execute().actionGet();
        SearchHits hits = searchResponse1.getHits();
        for(int i=0; i<hits.hits().length; i++) {
            SearchHit hit = hits.getAt(i);
            System.out.println("[" + i + "] " + hit.getId() + " : " +hit.sourceAsString());
        }

        client.close();
    }

    private static void printIndexResponse(String description, IndexResponse response) {
        System.out.println("Index response for: " + description);
        System.out.println("Index name: " + response.getIndex());
        System.out.println("Index type: " + response.getType());
        System.out.println("Index id: " + response.getId());
        System.out.println("Index version: " + response.getVersion());
    }
}
package in.blogspot.randompiler.elastic\u search\u demo;
导入in.blogspot.randompiler.elastic\u search\u impl.Event;
导入java.util.Date;
导入org.elasticsearch.action.count.CountRequestBuilder;
导入org.elasticsearch.action.count.CountResponse;
导入org.elasticsearch.action.delete.DeleteResponse;
导入org.elasticsearch.action.index.IndexResponse;
导入org.elasticsearch.action.search.SearchRequestBuilder;
导入org.elasticsearch.action.search.SearchResponse;
导入org.elasticsearch.client.client;
导入org.elasticsearch.client.transport.TransportClient;
导入org.elasticsearch.common.transport.InetSocketTransportAddress;
导入org.elasticsearch.index.query.FilterBuilder;
导入org.elasticsearch.index.query.FilterBuilders;
导入org.elasticsearch.index.query.QueryBuilders;
导入org.elasticsearch.search.SearchHit;
导入org.elasticsearch.search.SearchHits;
导入com.fasterxml.jackson.core.JsonProcessingException;
公共类ElasticSearchDemo
{
公共静态void main(字符串[]args)引发JsonProcessingException
{
客户端=新的TransportClient()
.addTransportAddress(新的InetSocketTransportAddress(“localhost”,9301));
DeleteResponse deleteResponse1=client.prepareDelete(“聊天数据”、“事件”、“1”).execute().actionGet();
DeleteResponse deleteResponse2=client.prepareDelete(“聊天数据”、“事件”、“2”).execute().actionGet();
DeleteResponse deleteResponse3=client.prepareDelete(“聊天数据”、“事件”、“3”).execute().actionGet();
事件e1=新事件(“登录”,新日期(),“Agent1登录聊天”);
字符串e1Json=e1.prepareJson();
System.out.println(“JSON:+e1Json”);
IndexResponse indexResponse1=client.prepareIndex(“聊天数据”、“事件”、“1”).setSource(e1Json).execute().actionGet();
printIndexResponse(“e1”,indexResponse1);
事件e2=新事件(“注销”,新日期(),“Agent1注销聊天”);
字符串e2Json=e2.prepareJson();
System.out.println(“JSON:+e2Json”);
IndexResponse indexResponse2=client.prepareIndex(“聊天数据”、“事件”、“2”).setSource(e2Json).execute().actionGet();
printIndexResponse(“e2”,indexResponse2);
事件e3 =新事件(“中断”),新的数据(),“Agunt1继续在聊天的中间中断”;
字符串e3Json=e3.prepareJson();
System.out.println(“JSON:+e3Json”);
IndexResponse indexResponse3=client.prepareIndex(“聊天数据”、“事件”、“3”).setSource(e3Json).execute().actionGet();
printIndexResponse(“e3”,indexResponse3);
FilterBuilder FilterBuilder=FilterBuilders.termFilter(“值”,“中间断开”);
SearchRequestBuilder searchBuilder=client.prepareSearch();
setPostFilter(filterBuilder);
CountRequestBuilder countBuilder=client.prepareCount();
setQuery(QueryBuilders.constantScoreQuery(filterBuilder));
CountResponse countResponse1=countBuilder.execute().actionGet();
System.out.println(“HITS:+countResponse1.getCount());
SearchResponse searchResponse1=searchBuilder.execute().actionGet();
SearchHits=searchResponse1.getHits();

对于(int i=0;i问题是由于您正在使用过滤器而导致的:

术语过滤器不会分析查询字符串中的数据,因此Elasticsearch会查找确切的字符串“break middle”

然而,第三份文件可能已被ES分解为以下单独条款:

Agent1 
went 
on 
break 
in 
the 
middle 
of 
a 
chat
要解决此问题,请使用一个过滤器或查询来分析您传递的字符串,例如使用查询或查询

例如:

QueryBuilder qb = QueryBuilders.matchQuery("event", "break middle");
或:


有关更多信息,请参阅。

如何将查询字符串或匹配放入java调用中?非常感谢!QueryBuilder工作非常轻松:)当然,奥利!我还有两个疑问1)当我创建索引并立即搜索它时,我不会断断续续地返回结果。但是,作为回应,它说索引已创建。弹性搜索是否需要一些时间才能使索引可搜索?2)我不明白在索引文档时使用映射的目的。我是这样做的能够使用默认映射和QueryBuilder查询全文。那么我什么时候以及为什么需要映射?
QueryBuilder QueryBuilder=QueryBuilders.matchQuery(“值”,“中间进行”);
输出:
2015年1月22日11:50:35 PM org.elasticsearch.plugins.plugins服务信息:[Living Diamond]加载[],站点[]JSON:…索引响应:E1…索引ID:1…JSON:…索引响应:E2…索引ID:2…JSON:…索引响应:E3…索引ID:3…命中:1(0)3:{“类型”:“中断”,“日期”:1421950810187,“值”:“Agunt1在聊天中间继续中断”}
有时点击:0。你能将此作为一个新问题发布吗?这样你会得到更多更好的答案。对于你的第二个问题,映射是自动生成的。这可能满足你的所有要求,但可能不满足-例如,你需要一个自定义解析器来分析你的数据,你可能想调整性能或在数据中设置“生存时间”。
QueryBuilder qb = QueryBuilders.matchQuery("event", "break middle");
QueryBuilder qb = QueryBuilders.queryString("break middle");