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