jcseg能否实现在分出的词后自动加空格的功能?

发布于 2021-11-24 15:58:11 字数 960 浏览 772 评论 3


solr中文本身是不支持模糊查询(半匹配的),但是可以通过如下两种方式实现:

引用http://blog.chenlb.com/2010/08/get-solr-analysis-word.html 
“这个问题的根本原因是 lucene / solr 使用的查询解析器生成的 Query 是短语查询。短语查询默认又是连续的词中没有其它字符。所以会找不到。 
目前我知的方式大概有二种: 
1、查询前分词一遍,把分出的词用空格分开,再去搜索(叫它为查询预处理)。查询前分词可以上面的接口。 
2、扩展 solr query parser,返回 boolean query。”
 

即搜索前,先处理一下query analyzer的分词(加空格),然后再搜索。

http://blog.chenlb.com/2010/08/solr-use-custom-query-parser.html 

网上一位大牛曾给出在solr1.4和3.5中的解决方案,但是4.9中调整了相关api。

本人小白一枚,不知道jcseg本身能否实现query时分词后自动加空格(可以再开一种模式)的功能。

希望您能在百忙之中抽出时间看一下,

谢谢!

@狮子的魂 @狮子的魂

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

各自安好 2021-11-27 19:44:00

引用来自“狮子的魂”的评论

Jcseg本身只提供分词的功能, 把一个字符串切分成一个一个的词条给你, 你想怎么处理都行.

JcsegTaskConfig config = new JcsegTaskConfig();	
ADictionary dic = DictionaryFactory.createDefaultDictionary(config);	
ISegment seg = SegmentFactory
				.createJcseg(JcsegTaskConfig.COMPLEX_MODE, new Object[]{config, dic});
seg.reset(new StringReader(str));
while ( (word = seg.next()) != null ) 
{
	//do what ever with the word
}

如果是solr有这个需求, 更改solr的Tokenizer即可:

org.lionsoul.jcseg.solr.JcsegTokenizer

@Override
	public boolean incrementToken() throws IOException 
	{
		clearAttributes();
		IWord word = segmentor.next();
		if ( word != null ) {
			termAtt.append(word.getValue());  //此处加上你想要的空格
			//termAtt.copyBuffer(word.getValue(), 0, word.getValue().length);

			termAtt.setLength(word.getLength());
			offsetAtt.setOffset(word.getPosition(), word.getPosition() + word.getLength());
			return true;
		} else {
			end();
			return false;
		}
	}

在 termAtt . append ( word . getValue ());处加上你要的空格.

天涯离梦残月幽梦 2021-11-27 09:49:56

谢谢,麻烦您了

恋你朝朝暮暮 2021-11-26 09:08:36

Jcseg本身只提供分词的功能, 把一个字符串切分成一个一个的词条给你, 你想怎么处理都行.

JcsegTaskConfig config = new JcsegTaskConfig();	
ADictionary dic = DictionaryFactory.createDefaultDictionary(config);	
ISegment seg = SegmentFactory
				.createJcseg(JcsegTaskConfig.COMPLEX_MODE, new Object[]{config, dic});
seg.reset(new StringReader(str));
while ( (word = seg.next()) != null ) 
{
	//do what ever with the word
}

如果是solr有这个需求, 更改solr的Tokenizer即可:

org.lionsoul.jcseg.solr.JcsegTokenizer

@Override
	public boolean incrementToken() throws IOException 
	{
		clearAttributes();
		IWord word = segmentor.next();
		if ( word != null ) {
			termAtt.append(word.getValue());  //此处加上你想要的空格
			//termAtt.copyBuffer(word.getValue(), 0, word.getValue().length);

			termAtt.setLength(word.getLength());
			offsetAtt.setOffset(word.getPosition(), word.getPosition() + word.getLength());
			return true;
		} else {
			end();
			return false;
		}
	}

在 termAtt . append ( word . getValue ());处加上你要的空格.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文