【问题标题】:Marklogic JSON document field indexMarklogic JSON 文档字段索引
【发布时间】:2017-03-29 17:14:50
【问题描述】:

我有一个包含所有 json 文档的 ML 数据库。我在为该文档创建字段时遇到问题。假设我有一个文档

{
    "id": "1452016",
    "name": "ALEXA488",
    "identifyingInfo": {
        "preparation": {
            "chemicalConjugations": [{
                "name": "ALEXA 488"
            }]
        }
    }
}

我为顶级 json 元素 name 创建了一个字段 ..

{
 "field-name": "concept_name",
 "field-path": [
  {
    "path": "/name",
    "weight": 1
  }
  ],
  "word-lexicon" :["http://marklogic.com/collation/en/S1"]
}

我也在这个字段上创建了一个字段范围索引..

现在当我像这样进行搜索时

xquery version "1.0-ml";
import module namespace search = "http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy";


let $search := ' (concept_name:(*ALEXA*))'

let $options :=
   <options xmlns="http://marklogic.com/appservices/search">
    <constraint name="collection">
        <collection prefix=""/>
    </constraint>
    <constraint name="concept_name">
        <word>
            <field name="concept_name" collation="http://marklogic.com/collation/en/S1"/>
        </word>
    </constraint>
    <term>
        <term-option>case-insensitive</term-option>
        <term-option>punctuation-insensitive</term-option>
        <term-option>whitespace-insensitive</term-option>
        <term-option>wildcarded</term-option>
    </term>
    <return-facets>false</return-facets>
    <return-values>false</return-values>
    <return-constraints>false</return-constraints>
    <return-frequencies>false</return-frequencies>
    <return-qtext>false</return-qtext>
    <search-option>format-json</search-option>
    <search-option>score-simple</search-option>
</options>

let $start := 1
let $page-length :=1

 let $result := search:search($search, $options, $start, $page-length)  

return $result

搜索匹配顶级nameidentifyingInfo/preparation/chemicalConjugations/name..

字段路径应该是什么,以便它只匹配顶级 json 元素,在本例中为 name

【问题讨论】:

    标签: marklogic marklogic-8


    【解决方案1】:

    您的字段路径看起来不错。你可以检查一下

    cts:field-value-match("concept_name", "*")
    

    但您正在尝试使用通配符。您是否在您的字段上启用了“尾随通配符搜索”?您是否还希望启用“一/二/三字符搜索”?

    【讨论】:

    • 我主要关心的是,它也匹配子元素name (dentifyingInfo/preparation/chemicalConjugations/name),我只想匹配顶级name。我想知道是否需要在该字段上指定其他任何内容以告诉它仅匹配顶级元素。
    【解决方案2】:

    我得到了这个工作。将您的约束替换为:

    <constraint name="concept_name">
      <value>
        <field name="concept_name" />
      </value>
    </constraint>
    

    在您的字段中,开启字段值搜索尾随通配符搜索

    我在一个数据库中创建了三个文档;一个和你的样本一样,一个在 /name 中只有“ALEXA”,一个在另一个名称中只有“ALEXA”。我的测试正确地找到了这两个文件。

    【讨论】:

    • 当您的文档在顶部名称和其他名称中包含 ALEXA 时,您的搜索 sn-p 是否也会在其他名称中显示 hit?对我来说,当我将约束更改为value 而不是word 时,我没有得到任何点击...` 词干搜索:基本, word 搜索, field value search, field value positions, fast 短语搜索, trailing 通配符搜索, trailing 通配符单词位置, 三个字符搜索`已打开。
    • 当我搜索时:resolve(search:parse($search, $options))/@total fn:count(cts:search(fn:doc(), cts:query(search:parse ($search, $options)))) 我得到不同的计数,而 cts:search 计数是正确的计数
    • @total 是一个估计值,由索引分辨率驱动; fn:count 使用过滤。有关详细信息,请参阅Fast Pagination and Unfiltered Searches。您可能可以打开索引以使数字相同。
    • 好的,但我仍然对为什么 search:search 匹配不在该字段中的文本感到困惑。
    猜你喜欢
    • 2011-08-28
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    相关资源
    最近更新 更多