1

我正在尝试在单个集合中索引大约 30,000 条数据库记录,并且根据我的要求,我需要能够在单个自定义字段中包含项目列表 - 并在我的搜索中使用它。

这是我的索引的示例:

<cfindex collection = "myCollection" 
             action = "refresh"
             type = "custom"
             query = "Local.myQuery" 
             key = "ID" 
             title="Title"
             applications_s="A_Comma_Separated_List"
             body = "a_field,a_nother_field">

在此示例中,applications_s 是一个动态自定义字段(在 CF10 中引入),其中包含应用程序 ID 列表。此字段的内容示例如下:

T1,T2,B4,G1

这一切都很好地索引,但是我一直无法弄清楚如何使用应用程序列表中的单个项目作为标准进行搜索。

所以,我希望能够做到这一点:

<cfsearch name="Local.qSearch"
    collection="myCollection"
    criteria="test AND applications_s:T1">

这应该返回正文中包含单词“test”的所有记录,并且在应用程序字段中还包含“T1”。但是,我找不到将自定义字段的内容视为逗号分隔列表的标准语法......它似乎只能作为字符串工作。因此,除非我包含通配符,否则不会返回我的示例记录 - 这可能会导致错误返回额外记录的问题。

有没有办法明确指定我的自定义字段是一个列表并且应该包含我的指定值?

4

1 回答 1

3

我设法使以下内容在 CF9.0.1 上工作。尽管MYCUSTOMNAME_TYPE(例如applications_s)字段仅适用于CF10,但我能够使用custom1 字段并通过编辑集合的schema.xml 并重新启动Solr 将其指定为“字符串”类型。你不应该在CF10上。

1) 在您要编制索引的查询中,将两个逗号添加到应用程序列表列的开头,并在末尾添加一个逗号,因此示例行如下所示:

,,T1,T1B,T2,B4,G1,

您可以在 SQL 中使用连接(首选)或通过使用 Query-of-Queries 或 QueryNew() 对查询结果进行后处理并循环查询以构建副本来执行此操作。

cfindex2)在您的问题中使用索引查询,使用applications_s以确保该字段是字符串类型,而不是文本。我们不希望列表被“标记化”为单词。逗号很关键,我们不希望它们被忽略。

3)在您的cfsearch垫子中,标准如下:

<cfset searchString= "test">
<cfset applicationFilter = "T1">
<cfsearch name="Local.qSearch"
    collection="myCollection"
    criteria="#searchString# AND applications_s:,*,#applicationFilter#,*">

请注意,共有 3 个逗号和 2 个通配符星号。第一个逗号在那里是因为您不能使用通配符启动 Solr 查询。第二个和第三个逗号确保 T1 的通配符搜索与 T1B 不匹配。

于 2013-06-06T10:53:00.410 回答