如何根据Marklogic中的用户输入创建自定义日期范围?

时间:2014-02-11 17:30:12

标签: constraints xquery marklogic faceted-search

我正在研究用XQuery编写的现有Marklogic应用程序。我们目前有一个存储桶约束,允许在定义的日期范围设置上进行分区,如下所示:

<constraint name="date" xmlns="http://marklogic.com/appservices/search">
    <range type="xs:gYear">
      <element ns="http://digital.library.ptsem.edu/ia" name="date"/>
      <bucket name="any-1800" lt="1801">–1800</bucket>
      <bucket name="1801-1825" ge="1801" lt="1826">1801–1825</bucket>
      <bucket name="1826-1850" ge="1826" lt="1851">1826–1850</bucket>
      <bucket name="1851-1875" ge="1851" lt="1876">1851–1875</bucket>
      <bucket name="1876-1900" ge="1876" lt="1901">1876–1900</bucket>
      <bucket name="1901-1925" ge="1901" lt="1926">1901–1925</bucket>
      <bucket name="1926-any" ge="1926">1926–</bucket>
    </range>
  </constraint>

用户当前可以通过单击UI中的相应构面来选择这些日期范围。

我想要做的是允许用户在表单中输入开始日期和结束日期,以便按自定义日期范围进行搜索。例如,他们能够以文本形式键入1950 - 1970并搜索此范围。我想这些自定义范围可能是通过从搜索选项中删除当前日期存储桶约束而不是使用范围约束来实现的,因此我们可以在查询文本中执行类似(date-start:1800 AND date-end:1900)的操作。另一种选择是根据用户输入的年份动态设置存储桶约束。

我真的不知道从哪里开始或者最好的方法是什么。有没有人做过类似的事情或建议如何最好地实现这一点?

谢谢!

1 个答案:

答案 0 :(得分:2)

从约束中删除存储桶会使您失去当前的方面。所以这听起来不像是一种选择。

我不确定,但我希望你已经可以像你所描述的那样使用日期约束。唯一的问题是-start和-end表示法是Corona风格,据我所知,搜索:搜索和搜索:解析期望语法如'date GE 1800 AND date LT 1900'。上面joemfb的评论中提到的链接也提到了这种语法。

如果由于存储桶而无法以这种方式使用当前日期约束,则只需制作两个约束。一个dateFacets包含facet的存储桶,另一个用于自定义搜索。

如果您愿意,可以进行一些预解析。如果您看到日期:1950-1970之类的模式,则可以使用字符串函数将其重写为日期GE / LT表达式。鉴于固定模式,应该是可行的。做完这个,在运行时没问题。

生成自定义存储桶也可以。如果很容易为特定搜索模式生成特殊存储桶。我实际上在上面提到的关于这样做的博客文章上发表评论。

所以,有很多方法可以实现。

HTH!