solr是基于 lucence开发的应用,如果query中带有非法字符串,结果很可能是检索出所有内容或者直接报错,所以你对用户的输入必须要先做处理。输入星号,能够检索出所有内容;输入加号,则会报错。
官方的处理办法(Java,因为solr是java开发的):
https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/util/ClientUtils.java public static String escapeQueryChars(String s) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); // These characters are part of the query syntax and must be escaped if (c == '\\' || c == '+' || c == '-' || c == '!' || c == '(' || c == ')' || c == ':' || c == '^' || c == '[' || c == ']' || c == '\"' || c == '{' || c == '}' || c == '~' || c == '*' || c == '?' || c == '|' || c == '&' || c == ';' || c == '/' || Character.isWhitespace(c)) { sb.append('\\'); } sb.append(c); } return sb.toString(); }
翻译的php版本(利用preg_replace函数进行正则替换):
static public function escape($value) { //list taken from http://lucene.apache.org/java/docs/queryparsersyntax.html#Escaping%20Special%20Characters $pattern = '/(\+|-|&|\||!|||\{|}|\[|]|\^|"|~|\*|\?|:|;|~|\/)/'; $replace = '\\\$1'; return preg_replace($pattern, $replace, $value); }
翻译后的python版本:
import re def escape_solr(word): return re.sub('(\\\|\+|-|&|\|\||!|||\{|}|\[|]|\^|"|~|\*|\?|:|;|/|\~)','\\\1', word )
相关推荐
Suggest.js插件的作用是,在用户开始输入查询词的时候,通过与Solr服务器交互,快速检索出可能的补全词项,并将其显示给用户。 使用suggest.js插件,开发者需要进行以下几个步骤来完成自动补全功能的开发: 1. ...
- **分词器**:在全文检索系统中,分词器扮演着非常重要的角色,它负责将输入的文本字符串切分成一个个有意义的词汇单元(即“词”),这一过程对于提高搜索的准确性和效率至关重要。 - **目的**:通过分词处理,...
分词是自然语言处理中的基础步骤,中文文本由于没有明显的空格或标点符号来指示单词边界,因此需要通过特定算法来识别词语。IK 分词器采用了多种算法,包括基于词典的匹配、统计模型等,能有效处理歧义、新词识别等...
Solr支持多种数据类型,包括字符串、数字、日期等,并且允许对数据进行复杂的查询和排序。通过创建索引,Solr能够实现全文搜索,即在用户输入部分关键词时,返回与之相关的所有文档。 在Solr的使用过程中,我们需要...
Solr查询与索引是Apache Solr的核心功能,它是一个基于Lucene的开源搜索引擎服务器,提供了高效、可扩展的全文检索、命中高亮、 faceted search(分面搜索)、拼写检查、动态集群等特性。在本文中,我们将深入探讨...
Solr7的IK分词器是针对中文文本检索的一个重要工具,它在全文检索领域扮演着关键角色。IK Analyzer是一款开源的、适用于Java环境的中文分词组件,专为提高中文信息处理的效率和准确性而设计。在Solr7版本中,IK分词...
- Query解析与处理:包括QueryParser、QParserPlugin等,负责解析查询语句并生成查询对象。 - HighLighting(高亮显示):提供文本片段的高亮功能。 - Update处理:负责文档的添加、删除和更新操作。 - Faceting(分...
- 可选查询:无特殊符号,词之间用空格分隔 3. 布尔操作: - AND:`word1 AND word2` 等同于 `+word1 +word2` - OR:`word1 OR word2` 等同于 `word1 word2` - NOT:`+word1 NOT word2` 等同于 `+word1 -word2` ...
`solrconfig.xml`文件定义了Solr服务器的行为,包括索引和查询处理、更新处理链、请求处理器、缓存策略等。 - **请求处理器(Request Handlers)**: 指定Solr如何响应不同的HTTP请求,如查询、添加、删除等。 - **...
- Lucene 能够处理各种文本数据,并且已经被广泛应用于多个领域,如文档检索、网站搜索等。 3. **Solr 与 Lucene 的关系**: - Solr 基于 Lucene 构建,可以说 Solr 是 Lucene 的服务器化版本。 - Solr 提供了更...
3. 查询分析器(Query Parsers):定义如何解析用户的查询字符串,如标准查询解析器(Standard Query Parser)或Lucene查询解析器。 4. 分析器(Analyzers):在索引和查询时,Solr使用分析器将输入的文本分解为可...
- **1.3.2 搜索**:用户通过提交查询请求到Solr,Solr根据请求条件从索引中检索数据并返回结果。 #### 二、Solr的安装与配置 **2.1 在Tomcat下Solr安装** - **2.1.1 安装准备**:确保已安装Java环境和Tomcat...
在Schema中,每个字段都有其特定的数据类型,如字符串、整数、日期等,这决定了字段如何被索引和处理。 1. **字段类型(Field Types)**:定义字段的数据类型和解析逻辑。例如,`text_general`类型适用于全文搜索,...
用户输入的查询字符串会被解析成一系列的查询项,这些项可以是单个词、短语或者更复杂的查询结构,如布尔表达式。Lucene支持多种查询类型,如匹配所有(Match All)、精确匹配(Term Query)、短语匹配(Phrase ...
这在处理特殊格式的数据,如URL、电子邮件地址或者专有名词时非常有用。 在实际应用中,为了提升搜索体验,我们还需要关注其他组件,如过滤器(Filter)和查询分析器(QueryAnalyzer)。过滤器可以进一步修改分词器...
mmseg4j采用四元组(四字节)编码方式,解决了中文字符集处理的问题,同时引入了动态最大匹配算法,能够有效避免过长或过短的分词结果。此外,它还支持自定义词典,允许用户根据实际需求添加或删除词汇,提高了分词...
- **分布式搜索**: 通过Solr或Elasticsearch等工具,实现跨服务器的分布式搜索,处理大规模数据。 - **内存缓存**: 利用缓存技术提高搜索性能,如使用FilterCache存储过滤器结果,TermQueryCache存储常见查询结果...
3. **搜索**:用户输入查询后,QueryParser将查询字符串转化为Query对象,然后使用IndexSearcher执行查询。 4. **结果排序**:根据评分系统,Lucene会返回得分最高的文档。 5. **文档检索**:找到相关文档后,使用...