某些通配符查询的搜索效果不佳

时间:2016-06-06 02:44:56

标签: search wildcard marklogic marklogic-8

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

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

我可以从查询计划中看到它将过滤db中的所有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

我尝试过一个未经过滤的查询,但这并没有帮助,因为我在整个文档中得到了一堆匹配,而不是我想要的字段。我甚至试图将根片段设置为我的person元素,但这似乎没有帮助。

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

感谢任何想法。

1 个答案:

答案 0 :(得分:3)

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

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

上面提到的搜索短语都包含带有通配符的两个字符。由于您只启用了三个字符选项,因此它必须依赖于过滤。有些人跑得快,有些慢,可能是因为缓存。如果重复相同的查询,MarkLogic将从缓存中返回结果。

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

HTH!