某些通配符查询的搜索性能不佳

poor search performance for certain wildcard queries

我在使用通配符搜索某些字母组合时遇到了性能问题,我不确定还需要做什么才能改进它。我的所有文档都遵循如下所示的信封模式。

<pdbe:person-envelope>
    <person xmlns="http://schemas.abbvienet.com/people-db/model">
        <account>
            <domain/>
            <username/>
        </account>
        <upi/>
        <title/>
        <firstName>
            <preferred/>
            <given/>
        </firstName>
        <middleName/>
        <lastName>
            <preferred/>
            <given/>
        </lastName>
    </person>
    <pdbe:raw/>
</pdbe:person-envelope>

我定义了一个名为 name 的字段,其中包括 firstName 和 lastName 路径:

{
  "field-name": "name",
  "field-path": [
    {
      "path": "/pdbe:person-envelope/pdbm:person/pdbm:firstName",
      "weight": 1
    },
    {
      "path": "/pdbe:person-envelope/pdbm:person/pdbm:lastName",
      "weight": 1
    }
  ],
  "trailing-wildcard-searches": true,
  "trailing-wildcard-word-positions": true,
  "three-character-searches": true
}

当我使用 search:search 进行一些查询时,有些返回速度很快,而有些则返回速度较慢。这是过滤后的查询。

search:search("name:ha*",
  <options xmlns="http://marklogic.com/appservices/search">
    <constraint name="name">
      <word>
        <field name="name"/>
      </word>
    </constraint>
    <return-plan>true</return-plan>
  </options>
  )

我从查询计划中可以看出它将过滤数据库中的所有 136547 个片段。但此查询运行速度很快。

<search:query-resolution-time>PT0.013205S</search:query-resolution-time>
<search:snippet-resolution-time>PT0.008933S</search:snippet-resolution-time>
<search:total-time>PT0.036542S</search:total-time>

然而,搜索 name:tj* 需要很长时间,并且还会过滤掉所有 136547 个片段。

<search:query-resolution-time>PT6.168373S</search:query-resolution-time>
<search:snippet-resolution-time>PT0.004935S</search:snippet-resolution-time>
<search:total-time>PT12.327275S</search:total-time>

我在两者上都有相同的索引。当我专门通过字段约束进行搜索时,是否应该启用任何其他索引?一般来说,我在数据库本身上启用了这些其他索引。

"collection-lexicon": true,
  "triple-index": true,
  "word-searches": true,
  "word-positions": true

我尝试进行未过滤的查询,但这没有帮助,因为我在整个文档中得到了一堆匹配项,而不是我想要的字段。我什至尝试将根片段设置为我的个人元素,但这似乎无济于事。

 "fragment-root": [
    {
      "namespace-uri": "http://schemas.abbvienet.com/people-db/model",
      "localname": "person"
    }
  ]

感谢任何想法。

如果您想为那个人元素使用可搜索的表达式,并且主要是当它在一个文档中多次出现时,片段根会很有帮助。它不会使您当前的搜索限制在该元素上。

在您的情况下,您启用了一些相关选项,但通配符选项仅适用于 4 个或更多字符。如果要搜索字符较少的通配符,则需要启用三个、两个和一个字符搜索选项。

上述搜索词组均包含两个带有通配符的字符。由于您只启用了三个字符选项,因此它必须依赖过滤。有些 运行 快,有些慢可能是因为缓存。如果您重复相同的查询,MarkLogic 将从缓存中 return 结果。

对于性能测试,您要么必须定期重新启动 MarkLogic 以刷新缓存,要么搜索(半)随机字符串以避免 MarkLogic 能够缓存。或者两者都有..

HTH!