mysql 多字段模糊查询
MySQLJava
在最近的一个项目需要实现在单表中对多字段进行同一关键字的模糊查询,查了一下有点收获
Java代码
select * from table where `字段`='值' and concat(`title`,`content`) like '%关键字%'
MySQL单表多字段模糊查询解决方法
2008-11-14 09:17
MySQL单表多字段模糊查询解决方法
在最近的一个项目需要实现在单表中对多字段进行多个关键字的模糊查询,但这数个关键字并不一定都存在于某个字段
例如现有table表,其中有title,tag,description三个字段,分别记录一条资料的标题,标签和介绍。然后根据用户输入的查询请求,将输入的字串通过空格分割为多个关键字,再在这三个字段中查询包含这些关键字的记录。
可目前遇到的问题是,这些关键字是可能存在于三个字段中的任意一个或者多个,但又要求三个字段必须包含所有的关键词。如果分别对每个字段进行模糊匹配,是没法实现所需的要求,由此想到两种方法:
在插入记录的同时,将需要进行多字段模糊查询的字段合并成一个字串并加入到一个新的字段中,然后对这个新字段进行模糊查询。
使用全文检索,但是这需要用到中文分词或者将汉字转化为拼音(拆分汉字是不可行的,MySQL默认FT最小字节为4),而且并不利于今后的维护。
在网上爬了两天,对此问题的处理都没有找到满意的解决方法,最后在《MySQL权威指南》中翻到了CONCAT的使用方法,在书中的对CONCAT的描述是:
CONCAT(str1,str2,…)
返回值:由全体出入参数合并在一起而得到的字符串。只要输入的参数中有NULL值,就返回NULL。CONCAT允许只有一个输入参数的情况。
因此,前文的查询可以通过下面这个SQL查询实现
SELECT * FROM `magazine` WHERE CONCAT(`title`,`tag`,`description`) LIKE ‘%关键字%’
在最近的一个项目需要实现在单表中对多字段进行多个关键字的模糊查询,但这数个关键字并不一定都存在于某个字段,查了一下有点收获
select * from table where `字段`='值' and concat(`title`,`content`) like '%关键字%'
今天有朋友问
引用原文:
请教一个问题:
我在mysql中建一个表,三百多万条记录,大约200mb大小,简单的模糊查询就很慢,请问有什么解决办法吗??也许 col_XX 会达到20个左右.
他的SQL如下:
1
select * from table_XX where col_1 like '%条件%' or col_2 like '%条件%' or col_3 like '%条件%'or col_4 like '%条件%'
首先,需要说明的是,以上的SQL语句,在任何类型的数据库上执行都不会使用到索引,意味着逐行扫描。
数据库只能做以下:
在建好联合索引 col_1,col_2.....后,
1
select * from table_XX where col_1 like '条件%' or col_2 like '条件%' or col_3 like '条件%'or col_4 like '条件%'
在必须以col_1作为where第一个条件的前提下,以上条件能使用到索引,也就是说最前面不能用%,只能以“条件”开头.
如果一定要实现 like '%条件%' ,数据库无法做到。
以下是实现的可选方案:
使用Lucene对需要检索的字段做全文检索(再加入自己的分词组件)。通过Lucene进行搜索(搜索效果要比数据库好得多),而非数据库。
音乐检索,用户数据一段文字,要求按照歌曲名、歌手名、专辑名进行查询匹配
Query query = MultiFieldQueryParser.parse(queryString, new String[]{"track_name","artist_name","release_name"}, new StandardAnalyzer());
mysql 多字段模糊查询
MySQLJava
在最近的一个项目需要实现在单表中对多字段进行同一关键字的模糊查询,查了一下有点收获
Java代码
select * from table where `字段`='值' and concat(`title`,`content`) like '%关键字%'
MySQL单表多字段模糊查询解决方法
2008-11-14 09:17
MySQL单表多字段模糊查询解决方法
在最近的一个项目需要实现在单表中对多字段进行多个关键字的模糊查询,但这数个关键字并不一定都存在于某个字段
例如现有table表,其中有title,tag,description三个字段,分别记录一条资料的标题,标签和介绍。然后根据用户输入的查询请求,将输入的字串通过空格分割为多个关键字,再在这三个字段中查询包含这些关键字的记录。
可目前遇到的问题是,这些关键字是可能存在于三个字段中的任意一个或者多个,但又要求三个字段必须包含所有的关键词。如果分别对每个字段进行模糊匹配,是没法实现所需的要求,由此想到两种方法:
在插入记录的同时,将需要进行多字段模糊查询的字段合并成一个字串并加入到一个新的字段中,然后对这个新字段进行模糊查询。
使用全文检索,但是这需要用到中文分词或者将汉字转化为拼音(拆分汉字是不可行的,MySQL默认FT最小字节为4),而且并不利于今后的维护。
在网上爬了两天,对此问题的处理都没有找到满意的解决方法,最后在《MySQL权威指南》中翻到了CONCAT的使用方法,在书中的对CONCAT的描述是:
CONCAT(str1,str2,…)
返回值:由全体出入参数合并在一起而得到的字符串。只要输入的参数中有NULL值,就返回NULL。CONCAT允许只有一个输入参数的情况。
因此,前文的查询可以通过下面这个SQL查询实现
SELECT * FROM `magazine` WHERE CONCAT(`title`,`tag`,`description`) LIKE ‘%关键字%’
在最近的一个项目需要实现在单表中对多字段进行多个关键字的模糊查询,但这数个关键字并不一定都存在于某个字段,查了一下有点收获
select * from table where `字段`='值' and concat(`title`,`content`) like '%关键字%'
今天有朋友问
引用原文:
请教一个问题:
我在mysql中建一个表,三百多万条记录,大约200mb大小,简单的模糊查询就很慢,请问有什么解决办法吗??也许 col_XX 会达到20个左右.
他的SQL如下:
1
select * from table_XX where col_1 like '%条件%' or col_2 like '%条件%' or col_3 like '%条件%'or col_4 like '%条件%'
首先,需要说明的是,以上的SQL语句,在任何类型的数据库上执行都不会使用到索引,意味着逐行扫描。
数据库只能做以下:
在建好联合索引 col_1,col_2.....后,
1
select * from table_XX where col_1 like '条件%' or col_2 like '条件%' or col_3 like '条件%'or col_4 like '条件%'
在必须以col_1作为where第一个条件的前提下,以上条件能使用到索引,也就是说最前面不能用%,只能以“条件”开头.
如果一定要实现 like '%条件%' ,数据库无法做到。
以下是实现的可选方案:
使用Lucene对需要检索的字段做全文检索(再加入自己的分词组件)。通过Lucene进行搜索(搜索效果要比数据库好得多),而非数据库。
lucene多索引文件并行查询
博客分类: Lucene
luceneSQL.net
Lucene并行索引多目录
Lucene并行索引多目录
1、多字段搜索就是同时要一个以上的字段中的内容进行比较搜索,类似概念在SQL中就是select * from Table where a like '%query%' or b like '%query%'。
Lucene.net中的单个字段查询大家都比较熟悉,这里对字段content进行搜索
Query query = QueryParser.Parse(querystr,"content",new ChineseAnalyzer());
Hits hits = searcher.Search(query);
对多个字段查询用到一个MultiFieldQueryParser对象,该对象继承自Query,我们要对字段title,content进行搜索。
string[] fields = {"content","title"};
Query multiquery = MultiFieldQueryParser.Parse(querystr,fields,new ChineseAnalyzer());
Hits hits = searcher.Search(multiquery);
2、多索引目录就是要在多个索引目录的中进行比较搜索,类似概念在SQL中就是select * from TableA union select * from TableB。
IndexSearcher[] searchers = new IndexSearcher[2];
searchers[0] = new IndexSearcher(IndexPath0);
searchers[1] = new IndexSearcher(IndexPath1);
MultiSearcher multisearcher = new MultiSearcher(searchers);
TopDocs multitopdocs = multisearcher.Search(query, null, 1000);
这个搜索的结果可能有相同的信息,比如你有一条相同的信息在多个目录中索引,搜索的结果就会出现多次相同的信息。
还有一种搜索方式是用到ParallelMultiSearcher这个对象,它是从MulitSearcher继承而来。
ParallelMultiSearcher parallelmultisearcher = new ParallelMultiSearcher(searchers);
TopDocs paralleltopdocs = parallelmultisearcher.Search(query, null, 1000);
这个搜索是对搜索后的结果进行合并,剔除重复的信息。
音乐检索,用户数据一段文字,要求按照歌曲名、歌手名、专辑名进行查询匹配
Query query = MultiFieldQueryParser.parse(queryString, new String[]{"track_name","artist_name","release_name"}, new StandardAnalyzer());
分享到:
相关推荐
这个示例代码将向我们展示如何使用Lucene来创建一个索引,并执行一个包含"java"关键字的查询。 首先,我们需要导入必要的Lucene库,包括核心类库和其他可能需要的模块,例如分析器(Analyzer)和文档(Document)...
4. **排序和评分**:Lucene支持对搜索结果进行排序,既可以按照相关性(由TF-IDF等算法计算得出的评分)排序,也可以按照其他自定义字段排序。 5. **扩展性**:Lucene允许开发者添加自定义的分析器、过滤器和查询...
在这个“Lucene3.0增删改查和关键字高亮实例”项目中,我们将深入理解如何利用Lucene 3.0版本进行索引构建、文档的增删改查操作,并学习关键字高亮显示的实现方法。 首先,我们要了解**创建索引**的基本流程。在...
“Lucene与数据库结合示例(加双关键字高亮)”这个标题表明,我们将讨论如何将开源全文搜索引擎Lucene与关系型数据库MySQL整合在一起,并且在搜索结果中实现关键词高亮显示,以提升用户体验。这通常涉及到数据的...
5. **解析查询**:`queryParser.parse()`方法接受用户输入的查询关键字,返回一个Query对象。 6. **创建查询器**:`IndexSearcher`执行查询,传入索引读取器和是否开启多线程。 7. **执行查询**:调用`...
Lucene的核心概念包括文档(Document)、字段(Field)、索引(Index)和查询(Query)。一个文档可以包含多个字段,每个字段有其特定的属性,如文本、可搜索或存储。索引是Lucene处理大量文本数据的方式,它将文本...
使用visual studio 开发的lucene.net和盘古分词实现全文检索。并按照lucene的得分算法进行多...有点小bug,在这个字段没有关键字的时候可能会不显示数据, 如果要是只看全文检索,可以自己去掉高亮,看一下检索结果。
本文将深入探讨Lucene.NET的多字段查询、建立索引以及组合查询等核心知识点。 一、Lucene.NET基础 1. **建立索引**:Lucene.NET的核心功能之一是创建全文索引,这使得快速检索成为可能。首先,我们需要创建一个`...
模糊搜索允许用户输入不完全准确的关键字,系统仍能返回相关的结果。在Lucene中,我们可以通过`FuzzyQuery`类来实现这种功能。`FuzzyQuery`基于Levenshtein距离算法,该算法计算两个字符串之间的差异程度,用于衡量...
例如,Lucene提供了一些优化选项,如字段缓存、位向量缓存等,可以帮助加快搜索速度。 6. **扩展性与可配置性**: Lucene具有高度的灵活性和可扩展性,可以与其他系统集成,如数据库、Web服务等。此外,可以通过...
- **关键字字段(Keyword)**:存储且不进行分词处理。 - **文本字段(Text)**:存储并进行分词处理。 - **未存储字段(Unstored)**:不存储也不进行分词处理。 - **仅索引字段(Indexed)**:仅进行索引但不存储。 ### ...
3. **查询(Query)**: Lucene 支持各种查询语法,包括简单关键字查询、布尔组合查询、短语查询、范围查询等。用户可以构建复杂的查询表达式来精确匹配需求。 4. **搜索(Searching)**: 搜索引擎接收查询后,通过...
本文将深入探讨如何使用Lucene.NET进行全文搜索,特别是针对多关键字匹配的场景。 首先,我们需要了解Lucene.NET的基本概念。Lucene是一个开源的文本搜索库,它的核心功能包括文档索引、搜索和排序。Lucene.NET是这...
在论文中,作者可能详细介绍了如何利用Lucene的API对职位信息进行建索引,包括字段划分、分词处理、权重计算等步骤,以确保搜索结果的相关性和精度。 其次,Heritrix是一个网络爬虫框架,用于抓取互联网上的网页...
综上所述,**Lucene 3.0 原理与代码分析**覆盖了全文检索的基础理论、Lucene 的总体架构、索引文件格式、索引过程、段合并过程、打分公式、搜索过程、查询语法、查询对象、分词器等多个方面,为开发者提供了深入理解...
标题 "Lunene分页关键字高亮显示" 暗示了我们正在讨论一个与搜索引擎或数据检索相关的项目,其中涉及到了Lunene(可能是Lucene的误拼),一种广泛使用的全文搜索引擎库,以及如何在搜索结果中实现分页和关键字高亮。...
Document包含多个Field,每个Field代表文档的一个属性或字段,如标题、内容等。例如: ```csharp var document = new Document(); document.Add(new TextField("content", "搜索内容", Field.Store.YES)); ...
全文搜索引擎与传统的基于关键字匹配的搜索引擎不同,它能够理解文本的语义,通过分析文本内容来建立索引。主要步骤包括:分词(Tokenization)、词干提取(Stemming)、停用词处理(Stop Word Removal)和索引构建...
全文检索与数据库中的LIKE关键字查询不同,LIKE虽然能进行模糊匹配,但其结果可能不准确,没有相关度排序,且效率较低。 【Lucene简介】 Lucene是一个由Java编写的高性能、可扩展的全文搜索引擎库。它提供了一种...