lucene 区分大小写 问题以及解决方案
转自:http://blog.csdn.net/huaishu/article/details/8543236
本文介绍lucene区分大小的原因,和解决方案.关于lucene大小写敏感问题我总结一下:
1.对于分词的Field且使用了StandardAnalyzer等分析器进行索引,同时利用StandardAnalyzer进行搜索时,lucene不区分大小写.
2.对于不分词的Field是区分大小写的.
一.分词和不分词
为了能使Field字段参与搜索,那么该Field就必须被索引.Field的Index类型必须是:(ANALYZED或TOKENIZED)和(NOT_ANALYZED或UN_TOKENIZED).区别在于:前者表示分词,后者表示不分词.例如:"中国人",使用StandardAnalyzer分析器分词结果是:"中","国","人".而不分词是把"中国人"作为整体建索引.
二.StandardAnalyzer底层原理
- public override TokenStream TokenStream(System.String fieldName, System.IO.TextReader reader)
- {
- TokenStream result = new StandardTokenizer(reader);
- result = new StandardFilter(result);
- result = new LowerCaseFilter(result);
- result = new StopFilter(result, stopSet);
- return result;
- }
这是StandardAnalyzer类的一段代码.LowerCaseFilter可知StandardAnalyzer在分词时会有转小写的操作.
建索引且分词时会被转小写.
- IndexSearcher searcher = new IndexSearcher("c:\\java\\index");
- QueryParser parser = new QueryParser("title", new StandardAnalyzer());
- Query query = parser.Parse(string.Format("title:{0}", key));
- hits = searcher.Search(query);
- printResult(hits, query.ToString());
这是段利用QueryParser和StandardAnalyzer的搜索,同样有转小写的操作.
由于建索引是底层小写,搜索也是被小写化了.故使用这种方式从外观接口的角度来说是不区分大小写的.
三.不分词和TermQuery查询
由于Field没有分词,所以建索引时数据会保持原始大小写.
- Hits hits = null;
- IndexSearcher searcher = new IndexSearcher("c:\\java\\index");
- TermQuery query = new TermQuery(new Term("name", key));
- hits = searcher.Search(query);
- printResult(hits, query.ToString());
这是一段使用TermQuery查询的方式.同样查询关键字是大写就大写,是小写就小写.
在这种使用情况下就会区分大小写.比如索引"abc",查询"Abc"就查不出来.
我的解决方案是:
建索引时小写化保存能,搜索时关键字小写化查询.
四.分词,不分词,StandardAnalyzer,TermQuery组合.
1.不一定建索引时使用StandardAnalyzer,搜索时也时用StandardAnalyzer或不分词和TermQuery查询.其实有很多组合.
2.不仅StandardAnalyzer底层小写化,还有别的分析器也是这样的.或者可以自定义分析器.
五.lucene区分大小写示例:
- using System;
- using System.Collections.Generic;
- using System.Text;
- using Lucene.Net.Documents;
- using Lucene.Net.Index;
- using Lucene.Net.Search;
- using Lucene.Net.Analysis;
- using Lucene.Net.Analysis.Standard;
- using Lucene.Net.QueryParsers;
- namespace IndexTest
- {
- class Program
- {
- static void Main(string[] args)
- {
- createIndex();
- searchNameByTermQuery("abc");
- searchTitleByTermQuery("abc");
- searchNameByTermQuery("ABC");
- searchTitleByTermQuery("ABC");
- searchNameByQueryParser("ABC");
- searchTitleByQueryParser("ABC");
- //修改后的解决方案
- createIndex2();
- searchNameByTermQuery2("ABC");
- Console.ReadLine();
- }
- public static void createIndex()
- {
- Document doc1 = new Document();
- Field field = null;
- field = new Field("name", "abc", Field.Store.YES, Field.Index.UN_TOKENIZED);
- doc1.Add(field);
- field = new Field("title", "abc", Field.Store.YES, Field.Index.TOKENIZED);
- doc1.Add(field);
- field = new Field("id", "1", Field.Store.YES, Field.Index.NO);
- doc1.Add(field);
- Document doc2 = new Document();
- field = new Field("name", "Abc", Field.Store.YES, Field.Index.UN_TOKENIZED);
- doc2.Add(field);
- field = new Field("title", "Abc", Field.Store.YES, Field.Index.TOKENIZED);
- doc2.Add(field);
- field = new Field("id", "2", Field.Store.YES, Field.Index.NO);
- doc2.Add(field);
- IndexWriter writer = new IndexWriter("c:\\java\\index", new StandardAnalyzer(), true);
- writer.AddDocument(doc1);
- writer.AddDocument(doc2);
- writer.Close();
- }
- public static void searchNameByTermQuery(string key)
- {
- Hits hits = null;
- IndexSearcher searcher = new IndexSearcher("c:\\java\\index");
- TermQuery query = new TermQuery(new Term("name", key));
- hits = searcher.Search(query);
- printResult(hits, query.ToString());
- }
- public static void searchTitleByTermQuery(string key)
- {
- Hits hits = null;
- IndexSearcher searcher = new IndexSearcher("c:\\java\\index");
- TermQuery query = new TermQuery(new Term("title", key));
- hits = searcher.Search(query);
- printResult(hits, query.ToString());
- }
- public static void searchNameByQueryParser(string key)
- {
- Hits hits = null;
- IndexSearcher searcher = new IndexSearcher("c:\\java\\index");
- QueryParser parser = new QueryParser("name", new StandardAnalyzer());
- Query query = parser.Parse(string.Format("name:{0}",key));
- hits = searcher.Search(query);
- printResult(hits, query.ToString());
- }
- public static void searchTitleByQueryParser(string key)
- {
- Hits hits = null;
- IndexSearcher searcher = new IndexSearcher("c:\\java\\index");
- QueryParser parser = new QueryParser("title", new StandardAnalyzer());
- Query query = parser.Parse(string.Format("title:{0}", key));
- hits = searcher.Search(query);
- printResult(hits, query.ToString());
- }
- public static void createIndex2()
- {
- Document doc1 = new Document();
- Field field = null;
- field = new Field("name", "abc".ToLower(), Field.Store.YES, Field.Index.UN_TOKENIZED);
- doc1.Add(field);
- field = new Field("title", "abc", Field.Store.YES, Field.Index.TOKENIZED);
- doc1.Add(field);
- field = new Field("id", "1", Field.Store.YES, Field.Index.NO);
- doc1.Add(field);
- Document doc2 = new Document();
- field = new Field("name", "Abc".ToLower(), Field.Store.YES, Field.Index.UN_TOKENIZED);
- doc2.Add(field);
- field = new Field("title", "Abc", Field.Store.YES, Field.Index.TOKENIZED);
- doc2.Add(field);
- field = new Field("id", "2", Field.Store.YES, Field.Index.NO);
- doc2.Add(field);
- IndexWriter writer = new IndexWriter("c:\\java\\index", new StandardAnalyzer(), true);
- writer.AddDocument(doc1);
- writer.AddDocument(doc2);
- writer.Close();
- }
- public static void searchNameByTermQuery2(string key)
- {
- Hits hits = null;
- IndexSearcher searcher = new IndexSearcher("c:\\java\\index");
- TermQuery query = new TermQuery(new Term("name", key.ToLower()));
- hits = searcher.Search(query);
- printResult(hits, query.ToString());
- }
- public static void printResult(Hits hits, String key)
- {
- Console.WriteLine("查询 " + key);
- if (hits != null)
- {
- if (hits.Length() == 0)
- {
- Console.WriteLine("没有找到任何结果");
- }
- else
- {
- Console.WriteLine("找到" + hits.Length() + "个结果");
- for (int i = 0; i < hits.Length(); i++)
- {
- Document d = hits.Doc(i);
- String id = d.Get("id");
- Console.WriteLine(id.ToString() + " ");
- }
- Console.WriteLine();
- }
- }
- }
- }
- }
- 上一篇Redis 命令手册
- 下一篇Lucene query使用总结
- 顶
lucene 区分大小写 问题以及解决方案的更多相关文章
- WEB.NET error:请添加一个名为 jquery (区分大小写)的 ScriptResourceMapping 解决方案
参考 http://blog.csdn.net/kisscatforever/article/details/50579935 今天用了一个组件 一个验证型的组件. 然后出现了这个问题. 我看了网上一 ...
- Solr和ES对比
Solr与ES(ElasticSearch)对比 搜索引擎选择: Elasticsearch与Solr 搜索引擎选型调研文档 Elasticsearch简介* Elasticsearch是一个实时的分 ...
- 搜索引擎选择: Elasticsearch与Solr
我用过这两种搜索引擎,但也仅仅是用过而已,没有非常深入研究,以下是我的看法 lucene是完全用java实现,而sphinx是支持java api.显然这两者是有差别的,用java实现的意义在于,你可 ...
- 在 Java 应用程序中使用 Elasticsearch
如果您使用过 Apache Lucene 或 Apache Solr,就会知道它们的使用体验非常有趣.尤其在您需要扩展基于 Lucene 或 Solr 的解决方案时,您就会了解 Elasticsear ...
- 【转】搜索引擎选择: Elasticsearch与Solr
原文地址:http://i.zhcy.tk/blog/elasticsearchyu-solr/ Elasticsearch简介 Elasticsearch是一个实时的分布式搜索和分析引擎.它可以帮助 ...
- Elasticsearch与Solr
公司之前有个用Lucene实现的伪分布式项目,实时性很差,后期数据量逐渐增大的时候,数据同步一次需要十几小时.当时项目重构考虑到的是Solr和ES,我参与的是Solr技术的预研.因为项目实时性要求很高 ...
- 全文检索选择-------- Elasticsearch与Solr
Elasticsearch简介* Elasticsearch是一个实时的分布式搜索和分析引擎.它可以帮助你用前所未有的速度去处理大规模数据. 它可以用于全文搜索,结构化搜索以及分析,当然你也可以将这三 ...
- 搜索引擎选择: Elasticsearch与Solr(转)
搜索引擎选型调研文档 Elasticsearch简介* Elasticsearch是一个实时的分布式搜索和分析引擎.它可以帮助你用前所未有的速度去处理大规模数据. 它可以用于全文搜索,结构化搜索以及分 ...
- 搜索引擎:Elasticsearch与Solr
搜索引擎选型调研文档 Elasticsearch简介* Elasticsearch是一个实时的分布式搜索和分析引擎.它可以帮助你用前所未有的速度去处理大规模数据. 它可以用于全文搜索,结构化搜索以及分 ...
随机推荐
- Kali 找回root 密码的操作步骤
1. 重启kali 进入grub 界面,选择 “kali GNU/Linux, Linux 3.7-trunk-686-pae(恢复模式)” 2. 然后按下键盘E 键 3.进入编辑模式,找到Linux ...
- Core Java Volume I — 3.10. Arrays
3.10. ArraysAn array is a data structure that stores a collection of values of the same type. You ac ...
- Oracle 12C RAC的optimizer_adaptive_features造成数据插入超时
问题分析 使用10046事件追踪方式,直接生成上传时的数据库事件日志进行分析,发现主要区别在于以下两条sql语句在每次长时间上传时都有出现,并且执行用户不是上传用户,而是数据库SYS用户. ***** ...
- hdu 2335 Containers
水题,就不解释了,不过这个题有一点很好,就是枚举的时候,枚举宽,也就是列数,因为这样才能越来越接近正方形 #include<cstdio> #include<cstring> ...
- Centos搭建openvpn+mysql数据库认证
服务器环境说明 1.系统版本 CentOS release 5.10 (Final) 64bits 2.软件版本 openvpn-2.3.6-1.el5 lzo-2.02-2.el5.1 lzo-d ...
- 关于 Ajax 提交参数格式,及返回类型json
function Login() { $.ajax({ //提交方式 type:&q ...
- ZOJ 1068 P,MTHBGWB
原题链接 题目大意:给定一个字符串,先用Morse Code编码,把编码倒序,再解码成字符串.现给定处理后的字符串,求原始信息. 解法:用C++String类的函数.每次读入一个字符,就在string ...
- js&jquery验证邮箱和手机号是否正确范例
实现源码: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ...
- 《Java程序设计》第4周学习总结
学号20145220 <Java程序设计>第4周学习总结 6.1.1 继承共同行为 •定义:继承基本上就是避免多个类间重复定义共同行为. •优点:1.提高了代码的复用性.2.让类与类之间产 ...
- Linux 命令ln
在linux中可用ln命令创建一个文件的链接(软链接或者硬链接) 硬链接的使用: root@IdeaPad:~# ln 2.txt e.txt root@IdeaPad:~# ls 1.txt 2.t ...