使用自定义字段中的列表搜索solr

使用自定义字段中的列表搜索solr,solr,coldfusion,lucene,cfml,cfsearch,Solr,Coldfusion,Lucene,Cfml,Cfsearch,我试图在一个集合中索引大约30000条数据库记录,根据我的要求,我需要能够在一个自定义字段中包含一个项目列表,并在搜索中使用它 以下是我的索引示例: <cfindex collection = "myCollection" action = "refresh" type = "custom" query = "Local.myQuery" key = "ID"

我试图在一个集合中索引大约30000条数据库记录,根据我的要求,我需要能够在一个自定义字段中包含一个项目列表,并在搜索中使用它

以下是我的索引示例:

<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">
这使得所有的索引都非常出色,但是我一直无法使用应用程序列表中的一个项目作为标准来找出如何进行搜索

因此,我希望能够做到这一点:

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

这将返回正文中包含单词“test”的所有记录,以及应用程序字段中包含“T1”的所有记录。但是,我找不到将自定义字段的内容视为逗号分隔列表的条件语法。。。它似乎只起到一根弦的作用。因此,除非我包含一个通配符,否则不会返回我的示例记录——这可能会导致错误返回额外记录的问题


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

我设法在CF9.0.1上使用了以下内容。虽然MYCUSTOMNAME_TYPE(例如,
applications_s
)字段仅为CF10,但我可以使用custom1字段,并通过编辑集合的schema.xml并重新启动Solr将其指定为“字符串”类型。你不应该在CF10上这样做

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

,,T1,T1B,T2,B4,G1,
您可以在SQL中使用串联(更可取),或者通过查询查询的查询后处理查询结果,或者通过QueryNew()并在查询上循环以生成副本来实现这一点

2) 与您的问题一样,使用
cfindex
索引查询,使用
applications\u s
确保字段是字符串类型,而不是文本。我们不希望列表被“标记”为单词。逗号很重要,我们不希望忽略它们

3) 在
cf搜索中
按如下方式填充条件:

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


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

请允许我在我的评论之前说,我没有像您询问的那样使用
cfindex
。读了这篇文章之后,我有几个问题/评论。首先,您可以根据需要将自定义属性命名为
custom1
custom2
custom3
custom4
?其次,文档指出,当
type=custom
与您的示例类似时,自定义属性应该指定查询列名。您的应用程序ID是否包含在数据库的一列中?嗨,Miguel,从CF10开始,您可以动态添加自定义字段,并根据需要命名它们-这与使用“custom1、custom2”等相同。如果customX有所不同,我很乐意使用它。其次,是的,应用程序ID返回到数据库列中。cfindex示例完全按照我的预期工作,我只是想找到一种语法,允许我匹配自定义列,将其视为列表。我开始认为这根本无法做到。我找不到有关搜索自定义字段的信息。似乎我可以寻找一个精确的匹配,或者使用通配符的匹配,但是因为我不能将通配符作为第一个字符,这对我来说是非常无用的。这似乎是一件非常明显的事情想做。。。我是否遗漏了一些内容,或者它是严重不受支持的??仅供参考,关于动态命名的自定义字段的文档如下:-出于某种原因,此信息不包括在CF10 CFIndex docs主页面中。通过进一步的实验,您似乎可以在自定义字段中搜索,但只能搜索“文本”类型的字段。不幸的是,我仍然无法找到将该字段中的数据作为列表处理的方法,因此搜索“T2”也将匹配“T2B”。我想这可能是最好的了。。。有一个想法-所以您只需添加额外的逗号来绕过通配符限制,然后在搜索中包含分隔符。。。我想这可能行得通。直到下周我才有机会测试它,但我会让你知道的。是的,这是一个黑客程序,但它似乎对CF9有效。我没有CF10的权限,但一定要让我们知道。字段类型必须是“字符串”而不是“文本”,这一点很重要。如果是“文本”,那么所有分隔符都将被忽略,而您需要它们来确保匹配是准确的。似乎在CF10上也能很好地工作。谢谢你的帮助!另外,我注意到在自定义字段中插入包含特殊字符或空值的值时出现的问题。该错误不会给您任何有关违规行的信息,但值得记住的是,自定义字段应该经过严格的清理。
<cfset searchString= "test">
<cfset applicationFilter = "T1">
<cfsearch name="Local.qSearch"
    collection="myCollection"
    criteria="#searchString# AND applications_s:,*,#applicationFilter#,*">