使用通配符搜索某些字母组合时遇到性能问题,我不确定还需要做些什么来改进它。我的所有文档都遵循信封图案,如下所示。
<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"
}
]
感谢任何想法。
答案 0 :(得分:3)
如果要对该person元素使用可搜索的表达式,并且主要是在一个文档中多次出现,则片段根很有用。它不会使您当前的搜索限制该元素。
在您的情况下,您启用了许多相关选项,但通配符选项仅适用于4个字符以上。如果要搜索字符较少的通配符,则需要启用三个,两个和一个字符搜索选项。
上面提到的搜索短语都包含带有通配符的两个字符。由于您只启用了三个字符选项,因此它必须依赖于过滤。有些人跑得快,有些慢,可能是因为缓存。如果重复相同的查询,MarkLogic将从缓存中返回结果。
对于性能测试,您可能需要定期重新启动MarkLogic以刷新缓存,或搜索(半)随机字符串以避免MarkLogic能够缓存。或许两者都是..
HTH!