`
lang
  • 浏览: 27912 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

尝试使用fuzzyquery分析中文字符的相似度

阅读更多
    需要对一些数据进行去掉重复处理,规则类似于,两条记录的名称和地址相似度很大,则认为是同样的,应该去掉当中的某一个。昨天晚上翻了lucene得书籍,想找找看有什么好的方法没有,最后决定尝试一下fuzzyquery,大早上的就写了一个,结果很让我莫名其妙!
    代码如下:
    

public class FuzzyQueryTest {

	public static void main(String[] args) {
		RAMDirectory directory = new RAMDirectory();
		try {
			IndexWriter indexWriter = new IndexWriter(directory,
					new MMAnalyzer(), true);
			Document document1 = new Document();
			Document document2 = new Document();
			Document document3 = new Document();
			Document document4 = new Document();
			Field f1 = new Field("content", "北京科技大学", Field.Store.YES,
					Field.Index.TOKENIZED);
			Field f2 = new Field("content", "北京语言大学", Field.Store.YES,
					Field.Index.TOKENIZED);
			Field f3 = new Field("content", "中国科技大学", Field.Store.YES,
					Field.Index.TOKENIZED);
			Field f4 = new Field("content", "北京大学科技馆", Field.Store.YES,
					Field.Index.TOKENIZED);
			document1.add(f1);
			document2.add(f2);
			document3.add(f3);
			document4.add(f4);
			indexWriter.addDocument(document4);
			indexWriter.addDocument(document3);
			indexWriter.addDocument(document2);
			indexWriter.addDocument(document1);
			indexWriter.close();
			// search
			IndexSearcher indexSearcher = new IndexSearcher(directory);
			Term term = new Term("content", "北京语言大学");
			FuzzyQuery fuzzyQuery = new FuzzyQuery(term);
			Hits hits = indexSearcher.search(fuzzyQuery);
			for (int i = 0; i < hits.length(); i++) {
				System.out.println(hits.doc(i));
				System.out.println(hits.score(i));
				Explanation explanation = indexSearcher.explain(fuzzyQuery, i);
				System.out.println(explanation.toString());
				System.out.println("-----------------");
			}
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (LockObtainFailedException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

      



结果是空,如果只是搜索大学或者北京,是有结果的。但是,怎么看这个结果都不能够满足我那个排重的需求阿!
各位,有什么好的建议!指导一下!

自己修正一下我自己提出的问题,我提出的问题实际上是比较两个字符的相似度。对于这个问题,doris给出的解释思路是使用lcss找到最大的匹配字符串。我正在考虑,找到最大字符串后,怎么通过某种机制来衡量和原来字符相似的评分!
分享到:
评论
1 楼 hellodesigner 2008-05-11  
你这段代码有两个地方可能有问题:
1、你搜索时,需要分词,因为你在索引的时候,你对搜索内容进行了分词。这是最大的问题。
2、你在构建FuzzyQuery对象时,根据你的需要设置一下相似度的阀值,当然了,默认的情况已经能满足你的需要了,如果你需要相似度更高一些的话,你可以调整一下。

相关推荐

    Lucene 搜索方法(模糊搜索)

    源码分析方面,`FuzzyQuery`类在Lucene的`org.apache.lucene.search`包下,其内部实现了模糊匹配的逻辑。`defaultMinSimilarity`和`defaultPrefixLength`是预设的默认值,可以根据实际应用的需求进行调整。此外,`...

    FuzzyQuery-Information-Retrieval:基于FuzzyQuery Lucene库的信息检索系统,Java实现

    在信息检索领域,FuzzyQuery 是一种非常重要的技术,它允许用户输入可能存在拼写错误或不精确的查询词,系统能够根据一定的相似度算法找出与查询词相近的文档。本项目"基于FuzzyQuery Lucene库的信息检索系统,Java...

    模糊查询源代码案例2

    在“FuzzyQuery2”这个案例中,开发者可能已经实现了上述的一种或多种模糊查询策略。具体实现可能包括以下步骤: 1. **关键词预处理**:去除空格、标点符号,对中文进行分词或转换为拼音。 2. **建立索引**:为了...

    Lucene查询语法

    FuzzyQuery fq = new FuzzyQuery(new Term("name", "word1"), 0.8f, 1); ``` `0.8f`为相似度阈值,`1`表示编辑距离。 ##### 1.6 临近搜索查询 临近搜索可以在短语后加上符号`~`来控制两个词之间的最大距离。 例如,...

    利用Lucene 实现高级搜索

    Lucene的`FuzzyQuery`允许设置相似度阈值,从而返回近似匹配的结果。 #### 范围搜索 范围搜索允许用户基于数值或日期字段限定搜索范围。例如,搜索价格在100到200之间的商品,或者查询某个日期区间内的记录。 总之...

    模糊查询源代码案例1

    在压缩包文件“FuzzyQuery”中,可能包含的源代码文件可能有`.java`、`.cpp`或`.py`等,分别对应Java、C++或Python等编程语言实现的模糊查询功能。源代码将展示如何构建Trie树、如何使用SQL查询以及可能的优化策略,...

    FuzzyMatch:学习目的基于Apache Lucene的项目

    FuzzyQuery允许设置一个最小相似度阈值,只有当查询词与索引项的相似度高于这个阈值时才会返回结果。 2. **PrefixQuery**:这种查询类型用于匹配以特定前缀开头的词。虽然不如FuzzyQuery灵活,但在某些情况下,如...

    说明文档1

    Fuzzy相关特征如`fuzz_qratio`和`fuzz_token_set_ratio`则是模糊匹配算法的应用,用于处理近似字符串匹配问题。 熵相关特征如`query_Entropy`表示查询的熵值,反映了信息的不确定性。转换率特征通过计算关键词的...

    Lucene 3.5 api HTML版

    - **模糊查询(Fuzzy Query)**: 支持相似度查询,允许用户搜索拼写相近的词。 - **范围查询(Range Query)**: 用于查找位于某个范围内的值,如日期或数值范围。 - **分面搜索(Faceted Search)**: 用于分类和过滤...

    Fuzzy-Information-Retrieval-Search:基于模糊信息检索的搜索引擎,在查询中包含拼写错误。 它已在 Java 和 Lucene 中实现

    例如,`FuzzyQuery` 类允许指定一个模糊度级别(通常用一个介于 0 和 1 之间的浮点数表示,值越小,模糊度越高)。此外,还可以使用 `PrefixQuery` 或 `WildcardQuery` 来处理部分匹配和通配符查询。 项目“Fuzzy-...

    全文搜索lucene知识

    - **近似搜索**(Fuzzy Search):支持拼写纠错和相似度搜索。 - **范围搜索**(Range Queries):可用于日期、数字等类型的数据。 - **高亮显示**(Highlighting):在搜索结果中突出显示匹配的关键词。 - **分面...

    全文检索必备:一些常用的ElasticSearch查询语句

    1. 使用URL参数:`q=guide`,这会从URL查询字符串中读取所有查询参数。例如,以下查询会返回所有包含"guide"的文档: ```bash GET /bookdb_index/book/_search?q=guide ``` 2. 使用Search Lite API或完整的...

    Lucene in Action 2nd Edition 英文版

    - **QueryParser**:用于解析用户输入的查询字符串并转换为查询对象(Query)。 - **IndexSearcher**:用于执行查询操作的类。 3. **全文搜索技术** - **布尔模型(Boolean Model)**:基于逻辑运算符的查询方法。 ...

Global site tag (gtag.js) - Google Analytics