首页
技术博客
PHP教程
数据库技术
前端开发
HTML5
Nginx
php论坛
新用户注册
|
会员登录
PHP教程
技术博客
编程问答
PNG素材
编程语言
前端技术
Android
PHP教程
HTML5教程
数据库
Linux技术
Nginx技术
PHP安全
WebSerer
职场攻略
JavaScript
开放平台
业界资讯
大话程序猿
登录
极速注册
取消
热门标签 | HotTags
netty
python2
js
emoji
format
heatmap
fetch
config
tree
php5
get
timezone
expression
express
bytecode
match
shell
uri
less
utf-8
request
c语言
sum
scala
char
client
rsa
web
hashset
python
buffer
io
foreach
testing
cpython
byte
tags
import
runtime
数组
usb
md5
python3
cookie
dockerfile
subset
search
php
instance
range
cSharp
post
callback
perl
require
nodejs
command
php8
httprequest
select
frameworks
plugins
uml
string
datetime
ascii
chat
merge
schema
node.js
hash
input
cPlusPlus
int
default
main
solr
metadata
blob
当前位置:
开发笔记
>
编程语言
> 正文
HBase中创建索引
作者:手机用户2502877255 | 来源:互联网 | 2023-05-26 08:29
hbasene(https://github.com/akkumar/hbasene)是开源项目,在hbase存储上封装使用Lucene来创建索引,代码API非常简单
hbasene(https://github.com/akkumar/hbasene)是开源项目,在hbase存储上封装使用Lucene来创建索引,代码API非常简单,熟悉lucene的朋友可以很方便地创建。
以下为测试代码,完成读取一张hbase上记录url和用户id的表,对其创建索引并进行简单的基于url的索引的代码。当取到search的结果后,就可以拿到想要的数据了。由于分词后将原始内容进行了反向索引,所以匹配就转化为了查询,速度相当快。
其中getDocumentFromHTable为读取一张hbase上己有的表,将url字段提取出来创建content索引。
创建索引的实质是用了HBaseIndexWriter和HBaseIndexReader两个分别继承自IndexWriter和IndexReader的类来做索引的读取和写入。同时使用了HBaseIndexStore来做存储。
而创建索引使用的分词等仍然是使用标准的lucene API。
注意hbasene使用的是hbase-0.20.5,需要修改少量源代码才能运行在0.90.x以上的版本中。
这里对创建索引表使用到的结构做下简单的说明,因为是lucene入门级水平,所以各位请尽管拍砖讨论。
索引表由以下几个CF构成:
fm.sequence: 记录sequenceId,在执行createLuceneIndexTable时需要写死该CF的row为sequenceId,qulifier为qual.sequence,值为-1。可以不用理会
fm.doc2int: DocumentId,每个document都会有一个这样的id,如果Field.Store设置为YES,则能在索引表中查询到该id并得到完整的内容。
fm.termVector: 向量偏移,用于模糊查找,记录偏移量等信息
fm.termFrequency:分词后的关键词在每个document中出现的频率,qulifier为documentId,value为出现次数
fm.fields:记录了content内容,row为documentId,value为document的全文内容,它和fm.docint是相反的,后者是反向索引。
fm.payloads:扩展CF,目前还没有用到
Java代码
import
java.io.IOException;
import
org.apache.hadoop.conf.Configuration;
import
org.apache.hadoop.hbase.HBaseConfiguration;
import
org.apache.hadoop.hbase.client.HTable;
import
org.apache.hadoop.hbase.client.HTablePool;
import
org.apache.hadoop.hbase.client.Result;
import
org.apache.hadoop.hbase.client.ResultScanner;
import
org.apache.hadoop.hbase.client.Scan;
import
org.apache.lucene.analysis.standard.StandardAnalyzer;
import
org.apache.lucene.document.Document;
import
org.apache.lucene.document.Field;
import
org.apache.lucene.document.Fieldable;
import
org.apache.lucene.index.IndexReader;
import
org.apache.lucene.index.Term;
import
org.apache.lucene.search.IndexSearcher;
import
org.apache.lucene.search.ScoreDoc;
import
org.apache.lucene.search.TermQuery;
import
org.apache.lucene.search.TopDocs;
import
org.apache.lucene.util.Version;
import
org.hbasene.index.HBaseIndexReader;
import
org.hbasene.index.HBaseIndexStore;
import
org.hbasene.index.HBaseIndexWriter;
public
class
test{
static
final
String indexName =
"myindex"
;
static
final
String dataName =
"t1"
;
public
static
void
main(String[] args)
throws
IOException {
try
{
Configuration conf = HBaseConfiguration.create();
//hbase-site.xml in the classpath
conf.set(
"hbase.rootdir"
,
"hdfs://192.168.0.1:9000/hbase"
);
conf.set(
"hbase.zookeeper.quorum"
,
"192.168.0.1,192.168.0.2,192.168.0.3"
);
HTablePool tablePool =
new
HTablePool(conf,
10
);
HBaseIndexStore.createLuceneIndexTable(indexName, conf,
true
);
//Write
HBaseIndexStore hbaseIndex =
new
HBaseIndexStore(tablePool, conf, indexName);
HBaseIndexWriter writer =
new
HBaseIndexWriter(hbaseIndex,
"content"
);
//Name of the primary key field.
getDocument(writer);
writer.close();
//Read/Search
IndexReader reader =
new
HBaseIndexReader(tablePool, indexName,
"f"
);
IndexSearcher searcher =
new
IndexSearcher(reader);
Term term =
new
Term(
"content"
,
"item.taobao.com"
);
TermQuery termQuery =
new
TermQuery(term);
TopDocs docs = searcher.search(termQuery,
3
);
searcher.close();
}
catch
(IOException e){
e.printStackTrace();
throw
e;
}
}
private
static
void
getDocument(HBaseIndexWriter writer)
throws
IOException{
Document doc =
new
Document();
doc.add(
new
Field(
"content"
,
"some content some dog"
, Field.Store.YES,
Field.Index.ANALYZED));
writer.addDocument(doc,
new
StandardAnalyzer(Version.LUCENE_30));
doc =
new
Document();
doc.add(
new
Field(
"content"
,
"some id"
, Field.Store.NO, Field.Index.ANALYZED));
writer.addDocument(doc,
new
StandardAnalyzer(Version.LUCENE_30));
doc =
new
Document();
doc.add(
new
Field(
"content"
,
"hot dog"
, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS));
writer.addDocument(doc,
new
StandardAnalyzer(Version.LUCENE_30));
}
private
static
void
getDocumentFromHTable(HTablePool tablePool, HBaseIndexWriter writer)
throws
IOException {
Document doc =
new
Document();
Scan scan =
new
Scan();
HTable htable = (HTable)tablePool.getTable(dataName);
ResultScanner results = htable.getScanner(scan);
Result row;
while
((row = results.next()) !=
null
){
doc =
new
Document();
String value =
new
String(row.getValue(
"test"
.getBytes(),
null
));
String url = value.split(
"\""
)[
2
];
doc.add(
new
Field(
"content"
, url, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_OFFSETS));
writer.addDocument(doc,
new
StandardAnalyzer(Version.LUCENE_30));
}
}
}
以下为运行后查看表的中情况:
hbase
https
git
lucene
api
search
get
int
ci
写下你的评论吧 !
吐个槽吧,看都看了
会员登录
|
用户注册
推荐阅读
web
优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ...
[详细]
蜡笔小新 2024-11-09 16:13:27
get
HDFS API
Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ...
[详细]
蜡笔小新 2024-11-13 17:31:50
get
Java 并发编程:深入解析 AtomicInteger 和 CAS 无锁算法
在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ...
[详细]
蜡笔小新 2024-11-12 16:40:04
express
Spring详解(六)AOP
原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ...
[详细]
蜡笔小新 2024-11-12 14:40:40
web
开发中遇到的一些常见问题及解决方案
本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ...
[详细]
蜡笔小新 2024-11-12 08:20:05
python
利用Python Paramiko库批量更新多台服务器的登录密码
本文介绍了如何使用Python的Paramiko库批量更新多台服务器的登录密码。通过示例代码展示了具体实现方法,确保了操作的高效性和安全性。Paramiko库提供了强大的SSH2协议支持,使得远程服务器管理变得更加便捷。此外,文章还详细说明了代码的各个部分,帮助读者更好地理解和应用这一技术。 ...
[详细]
蜡笔小新 2024-11-11 19:17:23
client
PHP微信支付退款功能实现及订单创建类代码(附带调用示例)
【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ...
[详细]
蜡笔小新 2024-11-11 13:17:39
client
Java Socket 关键参数详解与优化建议
Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ...
[详细]
蜡笔小新 2024-11-09 21:38:05
char
Java反射机制详解及应用场景
本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ...
[详细]
蜡笔小新 2024-11-13 16:08:08
python
Python 使用 DOM 和 SAX 解析 XML 的应用实例
本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ...
[详细]
蜡笔小新 2024-11-12 16:10:39
python
使用Python和smtplib实现邮件发送功能
本文详细介绍了如何使用Python中的smtplib库来发送带有附件的邮件,并提供了完整的代码示例。作者:多测师_王sir,时间:2020年5月20日 17:24,微信:15367499889,公司:上海多测师信息有限公司。 ...
[详细]
蜡笔小新 2024-11-12 12:21:27
python
检查在所有可能的“?”替换中,给定的二进制字符串中是否出现子字符串“10”带 1 或 0
检查在所有可能的“?”替换中,给定的二进制字符串中是否出现子字符串“10”带 1 或 0 ...
[详细]
蜡笔小新 2024-11-12 11:35:01
python
python解决CSF布料模拟滤波的批处理问题(解决获取多个点云数据las数据)
解决问题:1、批量读取点云las数据2、点云数据读与写出3、csf滤波分类参考:https:github.comsuyunzzzCSF论文题目ÿ ...
[详细]
蜡笔小新 2024-11-12 11:32:15
python
Go (Golang) 语言Golang 定时器Timer和Ticker、time.AfterFunc、time.NewTicker()实例
文章目录Golang定时器Timer和Tickertime.Timertime.NewTimer()实例time.AfterFunctime.Tickertime.NewTicke ...
[详细]
蜡笔小新 2024-11-12 09:39:10
char
InfluxDB、collectd与Grafana的详细安装与配置指南
本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ...
[详细]
蜡笔小新 2024-11-11 19:54:24
手机用户2502877255
这个家伙很懒,什么也没留下!
Tags | 热门标签
netty
python2
js
emoji
format
heatmap
fetch
config
tree
php5
get
timezone
expression
express
bytecode
match
shell
uri
less
utf-8
request
c语言
sum
scala
char
client
rsa
web
hashset
python
RankList | 热门文章
1
如何将MYSQL数据写入EXCEL且不覆盖原有内容
2
分布式websocket间通信
3
1月发布的累积更新导致Windows 10/11无法从CD/DVD光盘恢复系统
4
mysql整理9数据库设计的三大范式
5
这些年Android面试的那些套路,已整理成文档
6
馈线长度与信号衰减_功率衰减器
7
求助贴,我该拿这段婚姻怎么办?
8
手机4G网速变慢了,学会添加一个新的接入点,网速快了设置手机网络
9
优酷视频上传软件介绍软件教程已更新
10
怎样实现JPG在手机上免费压缩?
11
【音视频连载009】第二季 FFmpeg 打造简易播放器
12
专家:杀毒软件自身漏洞将严重威胁用户安全
13
计算机原理含汇编语言,计算机组成原理(含汇编语言)试题库
14
typecho如何让首页不显示某一分类文章?
15
【EOS钱包开发 四】钱包模块:新建钱包、解锁钱包、导入账号
PHP1.CN | 中国最专业的PHP中文社区 |
DevBox开发工具箱
|
json解析格式化
|
PHP资讯
|
PHP教程
|
数据库技术
|
服务器技术
|
前端开发技术
|
PHP框架
|
开发工具
|
在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |
京公网安备 11010802041100号
|
京ICP备19059560号-4
| PHP1.CN 第一PHP社区 版权所有