gpt4 book ai didi

solr - Solr 的分层分面搜索示例

转载 作者:行者123 更新时间:2023-12-04 15:21:32 27 4
gpt4 key购买 nike



我在哪里可以找到一个完整的示例,该示例展示了从索引文档到检索搜索结果的分层分面搜索是如何工作的?

我的研究到目前为止

Stackoverflow 有一些帖子,但它们都只针对分层分面搜索的某些方面;因此,我不会认为它们是重复的。我正在寻找一个完整的例子来理解它。我一直错过聚合工作的最后一个查询。

  • 这几乎正​​是我正在寻找的,但同样,不是完整的演练:Solr Hierarchical Faceting. Example needed

  • Solr 网页上有文档,但不了解那里给出的示例。
  • https://wiki.apache.org/solr/HierarchicalFaceting

  • 示例(概念上)

    我想在这里创建一个完整的演练示例,希望您能提供缺少的最后一部分。

    测试数据

    输入

    假设我们有 3 个文档,每个文档都是一个人。
    Alice (document 1)
    - Blond
    - Europe

    Jane (document 2)
    - Brown
    - Europe/Norway

    Bob (document 3)
    - Brown
    - Europe/Norway
    - Europe/Sweden

    输出

    此(当前错误)查询的预期输出
    http://server:8983/solr/my_core/select?q=*%3A*&wt=json&indent=true&facet=true&facet.field=tags_ss

    应该
    Hair_color (3)
    - blond (1)
    - brown (1)
    - black (1)

    Location (3)
    - Europe (4) // This should be 4 not 3, i.e. the sum of the leaves, because Alice is tagged with "Europe" only, without a country
    - Norway (2)
    - Sweden (1)

    因为所有文件都找到了。

    示例(以编程方式)

    这是我需要帮助的地方。如何实现上述概念示例?

    这是我已经走了多远。

    1. 创建测试数据 XML

    这是 documents.xml的内容 solr-5.1.0/testdata 中的文件子文件夹:
    <add>
    <doc>
    <field name="id">Alice</field>
    <field name="tags_ss">hair_color/blond</field>
    <field name="tags_ss">location/Europe</field>
    </doc>
    <doc>
    <field name="id">Jane</field>
    <field name="tags_ss">hair_color/brown</field>
    <field name="tags_ss">location/Europe/Norway</field>
    </doc>
    <doc>
    <field name="id">Bob</field>
    <field name="tags_ss">hair_color/black</field>
    <field name="tags_ss">location/Europe/Norway</field>
    <field name="tags_ss">location/Europe/Sweden</field>
    </doc>
    </add>
    _ssschema.xml 中定义作为
    <dynamicField name="*_ss" type="string"  indexed="true"  stored="true" multiValued="true"/>

    请注意,所有标签,例如 hair_colorlocation以及将来添加的任何标签都存储在同一个 tags_ss 中 field 。

    2.用Solr索引测试数据
    c:\solr-5.1.0>java -classpath dist/solr-core-5.1.0.jar -Dauto=yes -Dc=gettingstarted -Ddata=files -Drecursive=yes -Durl=http://server:8983/solr/my_core/update org.apache.solr.util.SimplePostTool .\testdata

    Solr statistics page

    3. 使用 Solr 查询(无分面)检索所有数据

    询问
    http://server:8983/solr/my_core/select?q=*%3A*&wt=json&indent=true

    结果
    {
    "responseHeader": {
    "status": 0,
    "QTime": 0,
    "params": {
    "indent": "true",
    "q": "*:*",
    "_": "1430830360536",
    "wt": "json"
    }
    },
    "response": {
    "numFound": 3,
    "start": 0,
    "docs": [
    {
    "id": "Alice",
    "tags_ss": [
    "hair_color/blond",
    "location/europe"
    ],
    "_version_": 1500334369469890600
    },
    {
    "id": "Jane",
    "tags_ss": [
    "hair_color/brown",
    "location/europe/Norway"
    ],
    "_version_": 1500334369469890600
    },
    {
    "id": "Bob",
    "tags_ss": [
    "hair_color/black",
    "location/europe/Norway",
    "location/europe/Sweden"
    ],
    "_version_": 1500334369469890600
    }
    ]
    }
    }

    4. 使用 Solr 查询(带分面)检索所有数据

    询问
    http://server:8983/solr/my_core/select?q=*%3A*&wt=json&indent=true&facet=true&facet.field=tags_ss

    结果
    {
    "responseHeader": {
    "status": 0,
    "QTime": 0,
    "params": {
    "facet": "true",
    "indent": "true",
    "q": "*:*",
    "_": "1430830432389",
    "facet.field": "tags_ss",
    "wt": "json"
    }
    },
    "response": {
    "numFound": 3,
    "start": 0,
    "docs": [
    {
    "id": "Alice",
    "tags_ss": [
    "hair_color/blond",
    "location/europe"
    ],
    "_version_": 1500334369469890600
    },
    {
    "id": "Jane",
    "tags_ss": [
    "hair_color/brown",
    "location/europe/Norway"
    ],
    "_version_": 1500334369469890600
    },
    {
    "id": "Bob",
    "tags_ss": [
    "hair_color/black",
    "location/europe/Norway",
    "location/europe/Sweden"
    ],
    "_version_": 1500334369469890600
    }
    ]
    },
    "facet_counts": {
    "facet_queries": {},
    "facet_fields": {
    "tags_ss": [
    "location/europe/Norway",
    2,
    "hair_color/black",
    1,
    "hair_color/blond",
    1,
    "hair_color/brown",
    1,
    "location/europe",
    1,
    "location/europe/Sweden",
    1
    ]
    },
    "facet_dates": {},
    "facet_ranges": {},
    "facet_intervals": {},
    "facet_heatmaps": {}
    }
    }

    请注意结果底部的这一部分:
    "facet_fields": {
    "tags_ss": [
    "location/europe/Norway",
    2,
    "hair_color/black",
    1,
    "hair_color/blond",
    1,
    "hair_color/brown",
    1,
    "location/europe",
    1,
    "location/europe/Sweden",
    1
    ]
    },

    它将所有标签显示为一个平面列表(不是分层的)。

    5. 使用 Solr 查询(使用分层分面)检索所有数据

    询问

    这是我的问题。我不知道如何构造返回以下结果的查询(结果已在上面的概念示例中显示)。

    结果(虚构,为说明而手工创建)
    {
    "responseHeader":{
    "status":0,
    "QTime":0,
    "params":{
    "facet":"true",
    "indent":"true",
    "q":"*:*",
    "facet.field":"tags_ss",
    "wt":"json",
    "rows":"0"}},
    "response":{"numFound":3,"start":0,"docs":[]
    },
    "facet_counts":{
    "facet_queries":{},
    "facet_fields":{
    "tags_ss":[
    "hair_color,3, // This aggregations is missing
    "hair_color/black",1,
    "hair_color/blond",1,
    "hair_color/brown",1,
    "location/europe",4, // This aggregation should be 4 but is 1
    "location/europe/Norway",2,
    "location/europe/Sweden",1]},
    "facet_dates":{},
    "facet_ranges":{},
    "facet_intervals":{},
    "facet_heatmaps":{}}}

    这个标签列表还是平的,但至少 location/europe = 4将被正确聚合,但目前不是。我不断收到 location/europe = 1因为它只设置为 AliceBobNorwaySweden未汇总也计入 Europe .

    想法
  • 我可能需要使用 facet.pivot ,但我不知道如何。
  • 我可能需要使用 facet.prefix ,但我不知道如何。

  • 版本
  • Solr 5.1.0
  • 视窗 7
  • 最佳答案

    如果将它们分阶段推送到索引中,则可以填充所有聚合。如果 Bob 来自挪威,则您最多可以在构面字段中填充三个值:

    location
    location/Europe
    location/Europe/Norway

    (作为替代设计,您可能有一个与位置字段分开的头发颜色字段,然后“位置”将永远不需要填充到字段本身中。)

    然后你的结果仍然是平的,但你的汇总总数是存在的。此时,您需要对结果集进行一些编程工作,以通过拆分分隔符(在本例中为 /)上的所有值来创建嵌套数据结构。一旦你有了嵌套的数据结构,那么分层显示它应该是可管理的。很难详细介绍这部分实现,因为您的嵌套数据结构和显示将在很大程度上取决于您的开发环境。

    避免在 Solr 构面字段中添加重复条目的另一个有点冒险的选择是仅添加您现在使用的值(例如 location/Europe/Norway ),但在迭代构面列表并构建您的嵌套数据结构。存在的风险是,如果一个人真正与欧洲的多个国家有联系,那么您可能会得到更高级别的总数 location/Europe .我选择在我自己的项目中填充单独的值,如上所述。尽管它们看起来是多余的,但总和最终会更加准确。

    (在 Solr 中,这只是很多做事方式中的一种。这种模型最适用于总叶子数可管理的系统,在这种情况下,预先检索所有分面值是有意义的,而不必进行额外的深入查询。)

    旋转选项

    Solr facet 透视可以直接从 Solr 返回分层结构的结果,但在某些情况下存在在值之间创建错误连接的风险。

    因此,假设您像这样加载文档:
    <add>
    <doc>
    <field name="id">Alice</field>
    <field name="continent">Europe</field>
    </doc>
    <doc>
    <field name="id">Jane</field>
    <field name="continent">Europe</field>
    <field name="country">Norway</field>
    </doc>
    <doc>
    <field name="id">Bob</field>
    <field name="continent">Europe</field>
    <field name="country">Norway</field>
    <field name="country">Sweden</field>
    </doc>
    </add>

    现在您使用 facet.pivot.mincount=1&facet.pivot=continent,country 执行方面数据透视查询.到目前为止,结果可能很棒:
    "facet_pivot":{
    "continent,country":[{
    "field":"continent",
    "value":"Europe",
    "count":3,
    "pivot":[{
    "field":"country",
    "value":"Norway",
    "count":2,},
    {
    "field":"country",
    "value":"Sweden",
    "count":1,}]}]}

    到现在为止还挺好。当您向数据中添加一个新人时,问题就出现了:
    <add>
    <doc>
    <field name="id">Susan</field>
    <field name="continent">Europe</field>
    <field name="country">Norway</field>
    <field name="continent">South America</field
    <field name="country">Brazil</field>
    </doc>
    </add>

    现在 Solr 实际上并不知道挪威在欧洲而巴西在南美洲,因此您将开始获得“欧洲 > 巴西”和“南美洲 > 挪威”的构面计数。

    如果您为所有国家/地区值添加大洲前缀,则问题是可以解决的:
    <add>
    <doc>
    <field name="id">Susan</field>
    <field name="continent">Europe</field>
    <field name="country">Europe/Norway</field>
    <field name="continent">South America</field
    <field name="country">South America/Brazil</field>
    </doc>
    </add>

    这样您仍然会得到不匹配的主元值,但您可以选择阻止任何没有与其大陆匹配的前缀的国家/地区级别的构面值。要使这成为一个问题,数据透视表中的多值字段必须具有与稍后出现在同一数据透视表中的值相关联的值。如果您不希望在单个记录中为这些字段提供多个值,或者如果您的值没有强关联(即特定的出身),则透视面可能是理想的解决方案。但在某些情况下,包含字段中的值之间的枢轴方面的分离可能会造成令人望而却步的困惑。

    关于solr - Solr 的分层分面搜索示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30054005/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com