提供了solr到elasticsearch的語法翻譯引擎:solr-to-es

jopen 9年前發布 | 16K 次閱讀 Solr 搜索引擎 solr-to-es

提供了一套solr到elasticsearch的語法翻譯引擎,兼容現有的solr語法。同時提供了基于注解的ORM功能,自動完成實體類對象與elasticsearch結果之間的轉換。你只要進行簡單的配置,系統便會會自動完成索引、type/mapping的創建工作。同時提供了比較常用的底層api。比如,通過這個工具,你可以用下面這條solr查詢語句在elasticsearch上進行搜索:

q=name:"季度"~1 AND type:Q&fq=tgsType:2&start=0&rows=5&sort=name+desc,code+asc&fl=name,code,logicId,pinyin&hl=true&hl.fl=name,code
&hl.simple.pre=<em>&hl.simple.post=</em>

工具特點

  • 基于注解自動創建index、type/mapping
  • 兼容solr語法
  • 提供了ORM功能,實體類和"表"之間自動轉換
  • 提供了豐富的底層api
  • 使用簡單,只需簡單配置
  • </ul>

    如何使用

    1.進行相關環境設置:

    請在你的classpath目錄新建elasticsearch.properties文件,內容參考如下:

    #elasticsearch集群名稱
    cluster.name = es_nrs_log

    elasticsearch集群中的主機地址列表(多個主機,以","分隔)

    hosts = 183.136.163.88,183.136.162.194,183.136.162.71

    elasticsearch客戶端連接端口號(默認9300)

    client.port = 9300

    每次運行前是否進行檢測(檢測相關的索引和type/mapping是否存在,不存在則根據實體類的注解自動生成)

    isCheck = true

    設置實體類所在的包路徑

    models.package.dir = org.cnfire.elasticsearch.model</pre>

    2.定義實體類:

    eg:如下定義了一個實體類Student:

    //@Document(index = "school", type = "student", settings = "school-settings.json")
    //OR
    @Document(index = "school", type = "student", replicas = 1, shards = 5)
    public class Student {
        @ID
        String id;
        @Field(type = FieldType.String, index = FieldIndex.analyzed, stored = true, analyzer = "ik")
        String name;
        @Field
        String sex;
        @Field(type = FieldType.Integer)
        int age;
        @Field(type = FieldType.Float)
        double score;
        @Field(type = FieldType.String)
        boolean isGraduated;
        @Field(analyzer = "ik")
        String description;

    相關的setter和getter省略</pre>

    現在,你已經定義了一個實體類,其描述的索引為school,相應應的type為student

    注:相關注解的詳細配置參考說明,會在接下來的時間里提供說明文檔

    3.現在你可以進行相關操作了,參考如下:

    public class TestAccessor {
        Class<Student> clazz = Student.class;
        IAccessor accessor = Beans.getAccessor();

    /*添加單個對象*/
    @Test public boolean add(){
        Student model = new Student();
        model.setId("1001");
        model.setName("jack");
        model.setAge(30);
        model.setSex("male");
        model.setScore(99.5);
        model.setIsGraduated(true);
        model.setDescription("jack is a good boy...");
        return accessor.add(model);
    }
    
    /*添加對象集合*/
    @Test public boolean testAddList(){
        Student model1 = new Student();
        model1.setName("kobe");
        Student model2 = new Student();
        model2.setName("james");
        Student model3 = new Student();
        model3.setName("jodarn");
        List<Student> list= new ArrayList<Student>();
        list.add(model1);
        list.add(model2);
        list.add(model3);
        return accessor.add(list);
    }
    
    /*根據ID獲取記錄*/
    @Test public void get(){
        System.out.println(accessor.get(clazz,"1001"));
    }
    
    /*根據查詢條件統計結果個數*/
    @Test public void count(){
        String params = "q=sex:male AND isGraduated:true";
        System.out.println(accessor.count(clazz, params));
    }
    
    /*根據條件進行搜索*/
    @Test public void search(){
        String params = "q=sex:male AND isGraduated:true&start=0&rows=15&sort=name+desc,age+asc&fl=name,score";
        System.out.println(accessor.search(clazz, params));
    }
    
    /*根據條件進行高亮查詢*/
    @Test public void searchWithHL(){
        String params = "q=sex:male AND isGraduated:true&start=0&rows=15&sort=name+desc,age+asc&fl=name,score" +
                "&hl=true&hl.fl=name&hl.simple.pre=<em>&hl.simple.post=</em>";
        System.out.println(accessor.search(clazz, params));
    }
    
    /*根據ID刪除一條記錄*/
    @Test public boolean deleteRecord(){
        return accessor.delete("ID1001",clazz);
    }
    
    /*根據查詢條件刪除多條記錄*/
    @Test public boolean deleteAll(){
        String params = "q=sex:male AND isGraduated:true";
        return accessor.delete(clazz,params);
    }
    
    /*根據輸入的索引名稱創建相應索引*/
    @Test public boolean createIndex(){
        return accessor.createIndex("testIndexName");
    }
    
    /*根據實體類自動解析注解,獲取相應settings,創建相應索引*/
    @Test public boolean createIndexWithSettings(){
        return accessor.createIndex(clazz);
    }
    
    /*根據索引名刪除相應索引*/
    @Test public boolean deleteIndex(){
        return accessor.deleteIndex("school");
    }
    
    /*刪除相應類型*/
    @Test public boolean deleteType(){
        /*根據索引名和類型名刪除相應類型*/
        return accessor.deleteType("school","student");
        // OR
        /*根據實體類刪除類型*/
        //accessor.deleteType(clazz);
    }
    
    /*根據實體類創建相關表對應的mapping*/
    @Test public void createMapping(){
        accessor.createMapping(clazz);
    }
    
    /*測試是否存在指定的索引*/
    @Test public boolean hasIndex(){
        return accessor.hasIndex("school");
    }
    
    /*測試是否存在指定的mapping/類型*/
    @Test public boolean hasMapping(){
        /*根據實體類判斷*/
        return accessor.hasMapping(clazz);
        /*根據索引名和類型名判斷*/
    

    // return accessor.hasMapping("school","student"); } }</pre>
    ok,當你運行程序時候,系統會自動檢測elasticsearch中相關的index和type/mapping是否存在,如果不存在則會根據注解自動創建
    更詳細的使用請參考項目中的test
    注:本系統所提供的查詢相關API暫只能使用標準的Lucene查詢語法,比如你要顯示地使用match_all,term等,其實都可以通過標準的Lucene語法進行查詢

    https://github.com/cnfire/solr-to-es

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!