文本字段上的 Solr OR 查询
Solr OR query on a text field
如何在带有 OR 条件的文本字段上执行简单查询?像 name:ABC OR name:XYZ
这样的结果集将只包含那些名称正好是 "XYZ" 或 "ABC" 的文档
挖了很多手册,无法弄清楚。
我使用 Solr 5.5.0
Update: 升级到Solr 6.6.0,还是搞不懂。以下是说明我的问题的插图:
- 这个有效:
- 这也有效:
- 这仍然有效:
- 但这不是!天哪,为什么!?
OR查询的方式有很多种。下面我列出了其中的一些。你可以select任何一个。
[简单查询]
q=name:(XYZ OR ABC)
[Lucene 查询解析器]
q={!lucene q.op=OR df=name v="XYZ ABC"}
您的语法是正确的,但您要求的不是文本字段的用途。文本字段被标记化(拆分为多个标记),并且每个标记都被自己搜索。所以如果插入的文本是"ABC DEF GHI",它将被拆分成三个单独的标记,即"ABC"、"DEF"和"GHI"。因此,当您搜索 field:ABC 时,您实际上是在搜索某处具有标记 "ABC" 的任何文档。
由于您想要执行 精确 匹配,您想要查询定义为 string
字段的字段,因为这将逐字保留值(包括大小写,因此匹配将区分大小写)。您可以通过添加 copyFile 指令告诉 Solr 将相同的内容索引到多个字段中,告诉它获取为字段 foo
提交的内容并将其复制到字段 bar
中,允许您同时执行如果需要完全匹配,如果需要更一般的搜索。
如果您需要执行精确但不区分大小写的搜索,您可以使用 KeywordTokenizer - KeywordTokenizer 什么都不做,在允许您向分析链添加过滤器之前将整个字符串保持为单个标记。通过添加 LowercaseFilter,您告诉 Solr 在存储字符串(或查询它)之前也将其小写。
您可以使用 Solr 管理页面下的 "Analysis" 页面进行试验,看看每个步骤如何处理您的字段的内容。
在那之后查询 string_field:ABC OR string_field:XYZ
应该做你想做的(或 string_field:(ABC OR XYZ)
或其他一些表达相同的方式。
我刚刚想出一个古怪的解决方法:
如何在带有 OR 条件的文本字段上执行简单查询?像 name:ABC OR name:XYZ
这样的结果集将只包含那些名称正好是 "XYZ" 或 "ABC" 的文档
挖了很多手册,无法弄清楚。
我使用 Solr 5.5.0
Update: 升级到Solr 6.6.0,还是搞不懂。以下是说明我的问题的插图:
- 这个有效:
- 这也有效:
- 这仍然有效:
- 但这不是!天哪,为什么!?
OR查询的方式有很多种。下面我列出了其中的一些。你可以select任何一个。
[简单查询]
q=name:(XYZ OR ABC)
[Lucene 查询解析器]
q={!lucene q.op=OR df=name v="XYZ ABC"}
您的语法是正确的,但您要求的不是文本字段的用途。文本字段被标记化(拆分为多个标记),并且每个标记都被自己搜索。所以如果插入的文本是"ABC DEF GHI",它将被拆分成三个单独的标记,即"ABC"、"DEF"和"GHI"。因此,当您搜索 field:ABC 时,您实际上是在搜索某处具有标记 "ABC" 的任何文档。
由于您想要执行 精确 匹配,您想要查询定义为 string
字段的字段,因为这将逐字保留值(包括大小写,因此匹配将区分大小写)。您可以通过添加 copyFile 指令告诉 Solr 将相同的内容索引到多个字段中,告诉它获取为字段 foo
提交的内容并将其复制到字段 bar
中,允许您同时执行如果需要完全匹配,如果需要更一般的搜索。
如果您需要执行精确但不区分大小写的搜索,您可以使用 KeywordTokenizer - KeywordTokenizer 什么都不做,在允许您向分析链添加过滤器之前将整个字符串保持为单个标记。通过添加 LowercaseFilter,您告诉 Solr 在存储字符串(或查询它)之前也将其小写。
您可以使用 Solr 管理页面下的 "Analysis" 页面进行试验,看看每个步骤如何处理您的字段的内容。
在那之后查询 string_field:ABC OR string_field:XYZ
应该做你想做的(或 string_field:(ABC OR XYZ)
或其他一些表达相同的方式。
我刚刚想出一个古怪的解决方法: