Riak Search功能使用

要使用Riak的search功能需要很复杂的步骤。根据官方文档的描述,要使用search功能需要经过下面的步骤:
1. 创建一个自定义的schema。如果不创建,可以使用自定义的schema。官方推荐在实际产品中使用自定义的schema。
2. 创建一个index和某个schema关联。如果不指定特定的schema,则使用系统默认的schema。
3. 关联索引。
一种是直接给一个bucket type指定一个索引,这样所有属于这个bucket type的bucket都会使用这个索引。(官方推荐使用这种)
另一种是给每一个bucket指定一个单独的索引。
另外也可以给已有的bucket指定一个索引。如果已有的bucket在默认的bucket type下面,那么可以单独给这个bucket指定一个索引。

package com.dasudian.dsdb.demo;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.concurrent.ExecutionException;

import com.basho.riak.client.api.RiakClient;
import com.basho.riak.client.api.commands.kv.DeleteValue;
import com.basho.riak.client.api.commands.kv.FetchValue;
import com.basho.riak.client.api.commands.kv.StoreValue;
import com.basho.riak.client.api.commands.search.StoreIndex;
import com.basho.riak.client.api.commands.search.StoreSchema;
import com.basho.riak.client.core.RiakCluster;
import com.basho.riak.client.core.RiakFuture;
import com.basho.riak.client.core.RiakNode;
import com.basho.riak.client.core.operations.SearchOperation;
import com.basho.riak.client.core.query.Location;
import com.basho.riak.client.core.query.Namespace;
import com.basho.riak.client.core.query.RiakObject;
import com.basho.riak.client.core.query.search.YokozunaIndex;
import com.basho.riak.client.core.query.search.YokozunaSchema;
import com.basho.riak.client.core.util.BinaryValue;

public class Search {
    private static String schemaName = "people_schema";
    private static String index = "people_index";
    private static String bucketType = "people_type";
    private static String bucket = "people_bucket";
    private static String key = "people_key";
    private static String data = "{\"name\":\"Jack_Liu\",\"age\":24,\"leader\":false}";
    private static String condtion = "name:Jack*";

    public static void main(String[] args) throws Exception {
        RiakNode node = new RiakNode.Builder().withRemoteAddress("192.168.1.28").withRemotePort(8087).build();
        RiakCluster riakCluster = new RiakCluster.Builder(node).build();
        riakCluster.start();
        RiakClient riakClient = new RiakClient(riakCluster);
        // 1.创建一个自定义的schema
//      createSchema(riakClient);
        // 2.创建一个索引和这个schema关联
//      createIndex(riakClient);

        // 3.在命令执行下面的两条命令,创建一个bucket type和这个index关联
        // riak-admin bucket-type create people_type  '{"props":{"search_index":"people_index"}}'
        // riak-admin bucket-type activate people_type

        store(riakClient);
        get(riakClient);
        // 4. 搜看有没有数据
        search(riakCluster);

//      delete(riakClient);

        riakCluster.shutdown();
    }

    public static void createSchema(RiakClient client) throws FileNotFoundException, ExecutionException, InterruptedException {
        File xml = new File(Search.class.getClassLoader().getResource("schema.xml").getFile());
        String xmlString = new Scanner(xml).useDelimiter("\\Z").next();
        YokozunaSchema schema = new YokozunaSchema(schemaName, xmlString);
        StoreSchema storeSchemaOp = new StoreSchema.Builder(schema).build();
        client.execute(storeSchemaOp);
    }

    public static void createIndex(RiakClient client) throws ExecutionException, InterruptedException {
        YokozunaIndex famousIndex = new YokozunaIndex(index, schemaName);
        StoreIndex storeIndex = new StoreIndex.Builder(famousIndex).build();
        client.execute(storeIndex);
    }

    public static void store(RiakClient client) throws ExecutionException, InterruptedException {
        Namespace ns = new Namespace(bucketType, bucket);
        String json = "application/json";
        RiakObject liono = new RiakObject().setContentType(json).setValue(BinaryValue.create(data));
        Location lionoLoc = new Location(ns, key);

        StoreValue lionoStore = new StoreValue.Builder(liono).withLocation(lionoLoc).build();
        client.execute(lionoStore);
    }

    public static void get(RiakClient riakClient) throws ExecutionException, InterruptedException {
        Namespace ns = new Namespace(bucketType, bucket);
        Location location = new Location(ns, key);
        FetchValue fv = new FetchValue.Builder(location).build();
        FetchValue.Response response = riakClient.execute(fv);
        for (RiakObject object : response.getValues()) {
            System.out.println(object.getValue());
        }
    }

    public static void search(RiakCluster riakCluster) throws InterruptedException {
        SearchOperation searchOp = new SearchOperation.Builder(BinaryValue.create(index), condtion).build();
        RiakFuture<com.basho.riak.client.core.operations.SearchOperation.Response, BinaryValue> execute = riakCluster
                .execute(searchOp);
        execute.await();
        if (execute.isDone()) {
            if (execute.isSuccess()) {
                List<Map<String, List<String>>> results = searchOp.getNow().getAllResults();
                System.out.println(results);
            } else {
                System.out.println(execute.cause());
            }
        }
    }

    public static void delete(RiakClient riakClient) throws ExecutionException, InterruptedException {
        Namespace ns = new Namespace(bucketType, bucket);
        Location location = new Location(ns, key);
        DeleteValue fv = new DeleteValue.Builder(location).build();
        riakClient.execute(fv);
    }
}

schema文件内容

<?xml version="1.0" encoding="UTF-8" ?>
<schema name="people" version="1.5">
 <fields>
   <!-- 添加自己的index规则。下面3行是自己根据数据的内容来创建的 -->
   <field name="name"   type="string"  indexed="true" stored="true" />
   <field name="age"    type="int"     indexed="true" stored="false" />
   <field name="leader" type="boolean" indexed="true" stored="false" />

   <!-- All of these fields are required by Riak Search -->
   <field name="_yz_id"   type="_yz_str" indexed="true" stored="true"  multiValued="false" required="true"/>
   <field name="_yz_ed"   type="_yz_str" indexed="true" stored="false" multiValued="false"/>
   <field name="_yz_pn"   type="_yz_str" indexed="true" stored="false" multiValued="false"/>
   <field name="_yz_fpn"  type="_yz_str" indexed="true" stored="false" multiValued="false"/>
   <field name="_yz_vtag" type="_yz_str" indexed="true" stored="false" multiValued="false"/>
   <field name="_yz_rk"   type="_yz_str" indexed="true" stored="true"  multiValued="false"/>
   <field name="_yz_rt"   type="_yz_str" indexed="true" stored="true"  multiValued="false"/>
   <field name="_yz_rb"   type="_yz_str" indexed="true" stored="true"  multiValued="false"/>
   <field name="_yz_err"  type="_yz_str" indexed="true" stored="false" multiValued="false"/>

   <dynamicField name="*" type="ignored"  />
 </fields>


 <uniqueKey>_yz_id</uniqueKey>

 <types>
    <!-- YZ String: Used for non-analyzed fields -->
    <fieldType name="_yz_str" class="solr.StrField" sortMissingLast="true" />

    <!-- 添加自己的类型 -->
    <fieldType name="string" class="solr.StrField" sortMissingLast="true" />
    <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
    <fieldtype name="ignored" stored="false" indexed="false" multiValued="true" class="solr.StrField" />
 </types>
</schema>

想了解更多关于如何创建自定义的schema可以查看官方文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值