solr是基于 lucence开发的应用,如果query中带有非法字符串,结果很可能是检索出所有内容或者直接报错,所以你对用户的输入必须要先做处理。输入星号,能够检索出所有内容;输入加号,则会报错。

官方的处理办法(java,因为solr是java开发的):

  1. https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/util/ClientUtils.java
  2.  
  3. public static String escapeQueryChars(String s) {
  4. StringBuilder sb = new StringBuilder();
  5. for (int i = 0; i < s.length(); i++) {
  6. char c = s.charAt(i);
  7. // These characters are part of the query syntax and must be escaped
  8. if (c == '\\' || c == '+' || c == '-' || c == '!' || c == '(' || c == ')' || c == ':'
  9. || c == '^' || c == '[' || c == ']' || c == '\"' || c == '{' || c == '}' || c == '~'
  10. || c == '*' || c == '?' || c == '|' || c == '&' || c == ';' || c == '/'
  11. || Character.isWhitespace(c)) {
  12. sb.append('\\');
  13. }
  14. sb.append(c);
  15. }
  16. return sb.toString();
  17. }

翻译的php版本(利用preg_replace函数进行正则替换):

  1. static public function escape($value)
  2. {
  3. //list taken from http://lucene.apache.org/java/docs/queryparsersyntax.html#Escaping%20Special%20Characters
  4. $pattern = '/(\+|-|&|\||!|\(|\)|\{|}|\[|]|\^|"|~|\*|\?|:|;|~|\/)/';
  5. $replace = '\\\$1';
  6.  
  7. return preg_replace($pattern, $replace, $value);
  8. }

翻译后的python版本:

    1. import re
    2. def escape_solr(word):
    3. return re.sub('(\\\|\+|-|&|\|\||!|\(|\)|\{|}|\[|]|\^|"|~|\*|\?|:|;|/|\~)','\\\1', word )

C#版

    /// <summary>
/// solr查询字符串特殊字符转义
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static String escapeQueryChars(String s)
{
StringBuilder sb = new StringBuilder();
var ss = s.ToCharArray();
foreach (var c in ss)
{
// 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 == '/'
)
{
sb.Append('\\');
}
sb.Append(c);
}
return sb.ToString();
}

solr系统query检索词特殊字符的处理的更多相关文章

  1. [转]solr系统query检索词特殊字符的处理

    原文地址:http://blog.csdn.net/wgw335363240/article/details/39889979 solr是基于 lucence开发的应用,如果query中带有非法字符串 ...

  2. 我的solr学习笔记--solr admin 页面 检索调试

    前言 Solr/Lucene是一个全文检索引擎,全文引擎和SQL引擎所不同的是强调部分相关度高的内容返回,而不是所有内容返回,所以部分内容包含在索引库中却无法命中是正常现象.      多数情况下我们 ...

  3. 【大数据技术】HBase与Solr系统架构设计

    如何在保证存储量的情况下,又能保证数据的检索速度. HBase提供了完善的海量数据存储机制,Solr.SolrCloud提供了一整套的数据检索方案. 使用HBase搭建结构数据存储云,用来存储海量数据 ...

  4. Solr DIH query 工作流

    本文地址 http://www.cnblogs.com/jasonxuli/p/6491270.html DataImportHandler (DIH) 支持全量数据导入和增量数据导入,主要有四个qu ...

  5. solr如何让全词匹配结果在最前面

    在全文搜索中默认排序是按照匹配度权值score排序的,权值越大位置越靠前,那为什么有很多时候全词匹配反而不在最前面那,其实很简单因为全词匹配权值也就是100,但是还有很多权值大于100的排在了前面. ...

  6. Solr查询query效果对比

    q条件 默认分词(org.apache.solr.analysis.TokenizerChain) "parsedquery" IK分词(org.wltea.analyzer.lu ...

  7. [Spring cloud 一步步实现广告系统] 8. 检索系统配置&依赖

    工作流程 项目依赖 <dependencies> <!-- hystrix 监控面板 --> <dependency> <groupId>org.spr ...

  8. DIH增量、定时导入并检索数据--转载

    原文地址:http://www.ifunit.com/984/solr%E5%AD%A6%E4%B9%A0%EF%BC%88%E4%BA%94%EF%BC%89dih%E5%A2%9E%E9%87%8 ...

  9. soso官方:基于相关排序的判断

    http://www.wocaoseo.com/thread-186-1-1.html 议程 概述 检索词 用户的信息需求 网页的自有信息 网页的附属信息 相关性的计算框架 概述 相关性的表象 检索词 ...

随机推荐

  1. kafka 的经典教程

    一.基本概念 介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计. 这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语:Kafk ...

  2. laravel 获取上一条insert语句产生的id

    <?php //頭部引入DB類 use Illuminate\Support\Facades\DB; //在方法中獲取获取上一条insert语句产生的id $id = DB::getPdo()- ...

  3. py-day1-6 python 5个灰魔法 【len,index索引,for循环,切片】

    # 索引,下标,获取字符串中的某一个字符. test = 'MuMingJun' v = test[3] print(v) i # 切片 test = 'MuMingJun' v = test[0:- ...

  4. Zuul 限流

    /** * 限流 */ @Component public class RateLimiterFilter extends ZuulFilter { //1秒钟100个令牌 private stati ...

  5. Ionic 使用karma进行单元测试

    1. 创建Ionic工程 ionic start projectname cd projectname 2.安装karma插件 npm install karma karma-jasmine karm ...

  6. 深入理解ASP.NET MVC(8)

    系列目录 过滤器上下文参数 前一节提到了四种MVC内建过滤器,它们无一例外都在关键的方法中提供了叫filterContext的参数,尽管它们各自类型不同,但是都继承自ControllerContext ...

  7. Python程序的执行过程 解释型语言和编译型语言

    转载地址:http://blog.csdn.net/lujiandong1/article/details/50067655 1. Python是一门解释型语言? 我初学Python时,听到的关于Py ...

  8. windebug 与 office Home

    https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/HomeStudentRetai ...

  9. Mysql binlog日志的介绍

    mysql的复制功能是  大规模,高性能应用的基础.  分担读负载.水平扩展 是通过二进制日志进行复制,是异步的. 只记录成功执行的修改事件,出现错误的和回滚的是不会纪录的. 日志路径 查看日志 RO ...

  10. Java 中统计文件中出现单词的次数练习

    统计英文article.txt文件中出现hello这个单词的次数 这个是article.txt文件内容 { hello The Royal Navy is trying hello to play h ...