编码之路 2017-06-06
solr精确查询
最近是用 solr 做搜索引擎,但是由于搜索特殊性,不需要分词后的检索结果,比如 搜 “汪翰翔” 会出来包含汪,翰,翔三中词的结果,但是需求只需要 完全匹配 “汪翰翔” 的结果,
Lucene中特殊符号一般用来匹配查询,但是也不可避免有些关键字中含有特殊符号,这时候我们需要对其进行转义,在网上搜索了很久,还是那篇来自车东的《在应用中加入全文检索功能 ——基于Java的全文索引引擎Lucene简介》写得比较经典,先将部分内容摘录如下:
Lucene支持通配符查询,模糊查询和临近查询:
1.用通配符搜索
Lucene支持单个与多个字符的通配搜索。
使用符号”?”表示单个任意字符的通配。
使用符号”*”表示多个任意字符的通配。
单个任意字符匹配的是所有可能单个字符。例如,搜索”text或者”test”,可以这样:
te?t
多个任意字符匹配的是0个及更多个可能字符。例如,搜索test, tests 或者 tester,可以这样:
test*
您也可以在字符窜中间使用多个任意字符通配符。
te*t
注意:您不能在搜索的项开始使用*或者?符号。
2.模糊查询
Lucene支持基于Levenshtein Distance与Edit Distance算法的模糊搜索。要使用模糊搜索只需要在单独项的最后加上符号”~”。例如搜索拼写类似于”roam”的项这样写:
roam~
这次搜索将找到形如foam和roams的单词。
注意:使用模糊查询将自动得到增量因子(boost factor)为0.2的搜索结果.
3.邻近搜索(Proximity Searches)
Lucene还支持查找相隔一定距离的单词。邻近搜索是在短语最后加上符号”~”。例如在文档中搜索相隔10个单词的”apache”和”jakarta”,这样写:
“jakarta apache”~10
Boosting a Term
Lucene provides the relevance level of matching documents based on the terms found. To boost a term use the caret, “^”, symbol with a boost factor (a number) at the end of the term you are searching. The higher the boost factor, the more relevant the term will be.
Lucene可以设置在搜索时匹配项的相似度。在项的最后加上符号”^”紧接一个数字(增量值),表示搜索时的相似度。增量值越高,搜索到的项相关度越好。
Boosting allows you to control the relevance of a document by boosting its term. For example, if you are searching for jakarta apache and you want the term “jakarta” to be more relevant boost it using the ^ symbol along with the boost factor next to the term. You would type:
通过增量一个项可以控制搜索文档时的相关度。例如如果您要搜索jakarta apache,同时您想让”jakarta”的相关度更加好,那么在其后加上”^”符号和增量值,也就是您输入:
jakarta^4 apache
This will make documents with the term jakarta appear more relevant. You can also boost Phrase Terms as in the example:
这将使得生成的doucment尽可能与jakarta相关度高。您也可以增量短语,象以下这个例子一样:
“jakarta apache”^4 “jakarta lucene”
By default, the boost factor is 1. Although, the boost factor must be positive, it can be less than 1 (i.e. .2)
默认情况下,增量值是1。增量值也可以小于1(例如0.2),但必须是有效的。
另外有一些符号并不是特殊符号,但是却表示特殊的意思。他们就是布尔运算符:
布尔操作符可将项通过逻辑操作连接起来。Lucene支持AND, “+”, OR, NOT 和 “-”这些操作符。(注意:布尔操作符必须全部大写)
OR
OR操作符是默认的连接操作符。这意味着如果两个项之间没有布尔操作符,就是使用OR操作符。OR操作符连接两个项,意味着查找含有任意项的文档。这与集合并运算相同。符号||可以代替符号OR。
搜索含有”jakarta apache” 或者 “jakarta”的文档,可以使用这样的查询:
“jakarta apache” jakarta
或者
“jakarta apache” OR jakarta
AND
AND操作符匹配的是两项同时出现的文档。这个与集合交操作相等。符号&&可以代替符号AND。
搜索同时含有”jakarta apache” 与 “jakarta lucene”的文档,使用查询:
“jakarta apache” AND “jakarta lucene”
+
“+”操作符或者称为存在操作符,要求符号”+”后的项必须在文档相应的域中存在。
搜索必须含有”jakarta”,可能含有”lucene”的文档,使用查询:
+jakarta apache
NOT
NOT操作符排除那些含有NOT符号后面项的文档。这和集合的差运算相同。符号!可以代替符号NOT。
搜索含有”jakarta apache”,但是不含有”jakarta lucene”的文档,使用查询:
“jakarta apache” NOT “jakarta lucene”
注意:NOT操作符不能单独与项使用构成查询。例如,以下的查询查不到任何结果:
NOT “jakarta apache”
–
“-”操作符或者禁止操作符排除含有”-”后面的相似项的文档。
搜索含有”jakarta apache”,但不是”jakarta lucene”,使用查询:
“jakarta apache” -”jakarta lucene”
Lucene还支持分组查询(Grouping)
Lucene支持使用圆括号来组合字句形成子查询。这对于想控制查询布尔逻辑的人十分有用。
搜索含有”jakarta”或者”apache”,同时含有”website”的文档,使用查询:
(jakarta OR apache) AND website
这样就消除了歧义,保证website必须存在,jakarta和apache中之一也存在。
转义特殊字符(Escaping Special Characters)
Lucene支持转义特殊字符,因为特殊字符是查询语法用到的。现在,特殊字符包括
+ – && || ! ( ) { } [ ] ^ ” ~ * ? : /
转义特殊字符只需在字符前加上符号/,例如搜索(1+1):2,使用查询 /(1/+1/)/:2
3.邻近搜索(Proximity Searches)
Lucene还支持查找相隔一定距离的单词。邻近搜索是在短语最后加上符号”~”。例如在文档中搜索相隔10个单词的”apache”和”jakarta”,这样写:
“jakarta apache”~10
Boosting a Term
Lucene provides the relevance level of matching documents based on the terms found. To boost a term use the caret, “^”, symbol with a boost factor (a number) at the end of the term you are searching. The higher the boost factor, the more relevant the term will be.
Lucene可以设置在搜索时匹配项的相似度。在项的最后加上符号”^”紧接一个数字(增量值),表示搜索时的相似度。增量值越高,搜索到的项相关度越好。
Boosting allows you to control the relevance of a document by boosting its term. For example, if you are searching for jakarta apache and you want the term “jakarta” to be more relevant boost it using the ^ symbol along with the boost factor next to the term. You would type:
通过增量一个项可以控制搜索文档时的相关度。例如如果您要搜索jakarta apache,同时您想让”jakarta”的相关度更加好,那么在其后加上”^”符号和增量值,也就是您输入:
jakarta^4 apache
This will make documents with the term jakarta appear more relevant. You can also boost Phrase Terms as in the example:
这将使得生成的doucment尽可能与jakarta相关度高。您也可以增量短语,象以下这个例子一样:
“jakarta apache”^4 “jakarta lucene”
By default, the boost factor is 1. Although, the boost factor must be positive, it can be less than 1 (i.e. .2)
默认情况下,增量值是1。增量值也可以小于1(例如0.2),但必须是有效的。
另外有一些符号并不是特殊符号,但是却表示特殊的意思。他们就是布尔运算符:
布尔操作符可将项通过逻辑操作连接起来。Lucene支持AND, “+”, OR, NOT 和 “-”这些操作符。(注意:布尔操作符必须全部大写)