【问题标题】:SOLR query comma separated fields without orderSOLR查询逗号分隔字段无顺序
【发布时间】:2025-12-29 17:05:12
【问题描述】:

我有一个字段,其中包含逗号分隔的值,例如 JSON、AngularJS 和另一个 AngularJS、JSON 和其他只有 JSON、HTML 的字段。

现在我一直在尝试使用 fq=field:(JSONAngularJS*) 查询 SOLR,但它只返回 AngularJS 之前的 JSON 记录。

我如何查询 SOLR 以便它返回具有 JSON 和 AngularJS 的记录但不考虑顺序。

为该领域附加 SOLR 分析:

查询形成: http://localhost:8983/solr/my_core/select?fq=field:(JSON%20AND%20AngularJS)&q=

【问题讨论】:

    标签: solr lucene


    【解决方案1】:

    使用基于, 标记的字段类型(即列表中的每个条目都会产生一个单独的标记)。您可以使用SimplifiedRegularExpressionPatternTokenizer

    <fieldType name="text" class="solr.TextField">
      <analyzer>
        <tokenizer class="solr.SimplePatternTokenizerFactory" pattern="[^,]+"/>
      </analyzer>
    </fieldType>
    

    通过询问同时存在 fq=field:(JSON AND AngularJS) 的文档来查询索引。

    (问题更新后)

    首先 - 您的字段似乎是 string 字段,而不是 TextField。

    通过 API 添加具有正确定义的字段:

    curl -X POST -H 'Content-type:application/json' --data-binary '{
      "add-field-type" : {
         "name":"comma-separated-list",
         "class":"solr.TextField",
         "positionIncrementGap":"100",
         "analyzer" : {
            "tokenizer":{
               "class":"solr.SimplePatternTokenizerFactory", "pattern": "[^,]+" },
            }
         }
      }
    }' http://localhost:8983/solr/collectionname/schema
    

    添加一组示例文档后:

    [
          {
            "langs":"JSON,AngularJS,Microsoft Visual Basic",
            "id":"foo",
            "address":"None",
            "_version_":1606953238273196032},
          {
            "langs":"JSON,AngularJS",
            "id":"foo2",
            "address":"None",
            "_version_":1606953238277390336},
          {
            "langs":"JSON,Microsoft Visual Basic",
            "id":"foo3",
            "address":"None",
            "_version_":1606953238278438912},
          {
            "langs":"AngularJS,JSON",
            "id":"foo4",
            "address":"None",
            "_version_":1606953238278438913}]
    

    然后使用fq=langs:(JSON AND AngularJS)&amp;q=*:*)查询:

      {
        "langs":"JSON,AngularJS,Microsoft Visual Basic",
        "id":"foo",
        "address":"None",
        "_version_":1606953238273196032},
      {
        "langs":"JSON,AngularJS",
        "id":"foo2",
        "address":"None",
        "_version_":1606953238277390336},
      {
        "langs":"AngularJS,JSON",
        "id":"foo4",
        "address":"None",
        "_version_":1606953238278438913}]
    

    未定义AngularJS 的文档已被忽略。

    【讨论】:

    • 我试过这个。将上述行添加到我的 managed_schema 文件中,重新启动 SOLR 并查询该字段的索引。说没有结果。如果我用 OR 替换 AND,它会给我一些结果,但不是想要的结果。
    • 您是否有您已编入索引的内容、您的查询以及分析页面可能显示的已编入索引内容的示例?
    • 我已经用分析的屏幕截图和正在形成的查询更新了原始问题。
    • 抱歉,这不是我想要的分析页面。在您的收藏下,左侧菜单中有一个名为“分析”的选项。它将为您提供在被索引时如何处理字符串的每一步。
    • 这将是默认行为 - 只要您使用 q 而不是 fq。过滤查询不会影响分数——它们只是过滤返回的文档集。 q 是您的主要查询,会影响分数计算。