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. Revit api 创建族并加载到当前项目

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. javascript UI lib

    react 现在已经有JS,android,IOS版本的了 react作为View层的库,结合Flux react native Angular 是 MVVM, React 是 Flux(或者 MVC ...

  3. create-react-app-typescript 知识点

    github:https://github.com/wmonk/create-react-app-typescript 报错:Import sources within a group must be ...

  4. range— 建立一个包含指定范围单元的数组 (數字、字母)

    range()函数快速创建从1到12的数字数组 $numbers=range(0,12); echo '<pre>'; print_r($numbers); echo '</pre& ...

  5. py-day2-2 python 元祖

    #元祖 tuple v = 'abddbwdhi' b = tuple(v) print(b) ('a', 'b', 'd', 'd', 'b', 'w', 'd', 'h', 'i') # 元素不可 ...

  6. Redis hash结构

    1. select 更换命名空间 select 1 2. 设置hash,key为mp,键为name 值为zhangsan  hexists判断hash的key是否存在 3. 获得map中键为name的 ...

  7. ASP.NET AJAX入门系列(9):在母版页中使用UpdatePanel

    本文简单介绍一下在母版页中使用UpdatePanel控件,翻译自官方文档. 主要内容 1.添加UpdatePanel控件到Content Page 2.通过Master Page刷新UpdatePan ...

  8. Spring Cloud(Dalston.SR5)--Hystrix 断路器

    Spring Cloud 对 Hystrix 进行了封装,使用 Hystrix 是通过 @HystrixCommand 注解来使用的,被 @HystrixCommand 注解标注的方法,会使用 Asp ...

  9. ML: 聚类算法R包-层次聚类

    层次聚类 stats::hclust stats::dist    R使用dist()函数来计算距离,Usage: dist(x, method = "euclidean", di ...

  10. Azure PowerShell (15) 批量导出Azure ASM/ARM VM信息

    <Windows Azure Platform 系列文章目录> 客户又提出新的需求,需要知道所有订阅下的虚拟机数量.运行情况等信息. 我花了点时间,写了一个PowerShell脚本,发布到 ...