• elasticsearch 操作


    文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

    客户端:https://www.elastic.co/guide/en/elasticsearch/client/index.html

    API:https://www.elastic.co/guide/en/elasticsearch/reference/6.4/search-request-from-size.html

    .net

    1.连接,项目中引用Nest包

    var settings = new ConnectionSettings(new Uri("http://example.com:9200"))
        .DefaultIndex("people");
    
    var client = new ElasticClient(settings);

    2.索引

    public class Person
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    var person = new Person
    {
        Id = 1,
        FirstName = "Martijn",
        LastName = "Laarman"
    };
    
    var indexResponse = client.IndexDocument(person); 
    
    var asyncIndexResponse = await client.IndexDocumentAsync(person); 

    3.查询

    var searchResponse = client.Search<Person>(s => s
        .From(0)
        .Size(10)
        .Query(q => q
             .Match(m => m
                .Field(f => f.FirstName)
                .Query("Martijn")
             )
        )
    );
    
    var people = searchResponse.Documents;

    4.删除

    var person = new Person
    {
        Id = 1
    };
    var deleteResponse= client.Delete<Person>(dept);

    在kibana中操作

    查看

    删除

    添加一个新的Index

    public class StudentQuery
        {
            public int StudentId { get; set; }
            public List<string> Items { get; set; }
        }
    var settings = new ConnectionSettings(new Uri("http://10.15.4.155:9200/")).DefaultIndex("student");
                var client = new ElasticClient(settings);
                for (int i = 0; i < 10; i++)
                {
                    StudentQuery student = new StudentQuery();
                    student.StudentId = i;
                    student.Items = new List<string>();
                    student.Items.Add("Code"+i);
                    student.Items.Add("Name"+i);
                    student.Items.Add("CardId"+i);
                    student.Items.Add("IdentityId"+i);
                    var indexResponse = client.IndexDocument(student);
                }
    View Code

    查询

    var searchResponse = client.Search<StudentQuery>(s => s.
                    Query(q=>q.
                        Match(m=>m.
                            Field(f=>f.Items)
                            .Query("CardId1")
                        )
                    )
                );
    View Code

    在kibana中查询

    GET /student/studentquery/_search/
    {
        "query": {
        "match": {
          "items": {
            "query": "Code8"
          }
        }
      }
    }
    View Code

    对同一字段多个值查询

    或者使用term

    GET /_search
    {
        "from" : 0, "size" : 10,
        "query" : {
            "term" : { "user" : "kimchy" }
        }
    }

    这里要注意match和term的区别

    Why doesn’t the term query match my document?

    简单来说就是string类型的字段在index之前会已fulltext的方式被es进行默认分词,比如放入“基金交易”,用term来查“基金”可能就查不到,用match就可以。

    Java

    @Service
    public class ElasticService {
        @Value("${elastic.host}")
        private String host;
        @Value("${elastic.port}")
        private int port;
    
        private RestHighLevelClient client;
    
        public void index(String index, List<MetisQuestion> list) throws Exception {
            client = new RestHighLevelClient(
                    RestClient.builder(
                            new HttpHost(host, port, "http")));
            for(MetisQuestion o :list){
                IndexRequest request = new IndexRequest(index,"doc");
                ObjectMapper mapper=new ObjectMapper();
                String json=mapper.writeValueAsString(o);
                request.source(json, XContentType.JSON);
                IndexResponse response = client.index(request, RequestOptions.DEFAULT);
                System.out.println(response.status());
            }
        }
    
        public void search(String index,String key){
            client = new RestHighLevelClient(
                    RestClient.builder(
                            new HttpHost(host, port, "http")));
            SearchRequest searchRequest = new SearchRequest(index);
            searchRequest.types("doc");
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            sourceBuilder.query(QueryBuilders.termQuery("question", key));
            searchRequest.source(sourceBuilder);
            getResponse(searchRequest);
        }
    
        public void search(String index,String key,String... values){
            client = new RestHighLevelClient(
                    RestClient.builder(
                            new HttpHost(host, port, "http")));
            SearchRequest searchRequest = new SearchRequest(index);
            searchRequest.types("doc");
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            sourceBuilder.query(QueryBuilders.termsQuery(key,values));
            sourceBuilder.size(5);
            searchRequest.source(sourceBuilder);
            getResponse(searchRequest);
        }
    
        private void getResponse(SearchRequest searchRequest) {
            try {
                SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
                SearchHits hits = searchResponse.getHits();
                for (SearchHit hit : hits) {
                    String sourceAsString = hit.getSourceAsString();
                    ObjectMapper mapper=new ObjectMapper();
                    MetisQuestion question=mapper.readValue(sourceAsString,MetisQuestion.class);
                    System.out.println(question.getQuestion());
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }
    View Code
  • 相关阅读:
    WPF 修改Webbrowser的IE版本小程序(32位)
    AnyCAD OpenSource 版本下载和编译
    请求ajax失败的原因(进入到error)
    如何将多个数据的- 转为:来匹配josn格式
    jQuery ajax如何传多个值到后台页面,举例:
    java finalize方法总结、GC执行finalize的过程
    SQL Server索引碎片整理实际操作记录
    MYSQL手册
    Eclipse显示行号
    MyEclipse设置Console输出到文件
  • 原文地址:https://www.cnblogs.com/uptothesky/p/9071389.html
Copyright © 2020-2023  润新知