【问题标题】:Querying against a comma separated list of IDs with Examine and Lucene.Net?使用 Examine 和 Lucene.Net 查询逗号分隔的 ID 列表?
【发布时间】:2018-04-10 19:17:23
【问题描述】:

我正在使用 Examine for Umbraco(构建在 Lucene.net 之上)进行搜索。我很确定我的问题与 Lucene 相关。

我的一个字段包含逗号分隔的 ID 列表。如何正确查询该字段?

例如。我有一个值为“64,65”的字段。我曾尝试使用 MultipleCharacterWildcard,它仅在我查询 ID 64 时返回结果,但不返回 ID 65。SingleCharacterWildcard 不返回任何内容,并且 Fuzzy 仅在字段中只有一个 ID 时返回某些内容。关于如何进行适当搜索的任何想法?我想我正在寻找的是一个“包含”查询。

这也是处理逗号分隔列表字段的正确方法,还是将逗号分隔列表拆分为单个字段更好?

【问题讨论】:

    标签: lucene lucene.net


    【解决方案1】:

    我当然会将列表拆分为单独的字段。一个文档中的同一个字段名可以有多个值,这是表示一组值的一种相当自然的方式:

    venue_id: 12345
    treatment_id_set: 1234
    treatment_id_set: 2345
    

    有了这样的文档,我可以简单地查询“treatment_id_set:1234”来查找支持该治疗的所有场所。当然,治疗的顺序丢失了。如果您需要恢复它,请在索引各个成员时存储逗号分隔的值:

    # stored, indexed
    venue_id: 12345
    # stored, not indexed
    treatment_id_list: 1234,2345
    # not stored, indexed
    treatment_id_set: 1234
    treatment_id_set: 2345
    

    【讨论】:

    • 如何使用 Umbraco Examine 设置多个值?
    【解决方案2】:

    为了使用 Umbraco Examine 将具有相同键值的重复字段添加到 Lucene,您需要挂钩到“文档写入”事件。

    _index.DocumentWriting += _index_DocumentWriting;
    

    这将暴露底层的 Lucene 文档。

    然后可以像这样添加字段:

    foreach (var item in someList)
                    {
                        e.Document.Add(new Field("fieldName", item, Field.Store.YES, Field.Index.NOT_ANALYZED));
                    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      相关资源
      最近更新 更多