0

我想知道是否可以将带状疱疹与简单查询字符串查询一起使用。我对相关字段的映射如下所示:

{
    "text_2": {
        "type": "string",
        "analyzer": "shingle_analyzer"
    }
}

分析器和过滤器定义如下:

"analyzer": {
    "shingle_analyzer": {
        "type": "custom",
        "tokenizer": "standard",
        "filter": ["standard", "custom_delimiter", "lowercase", "stop", "snowball", "filter_shingle"]
    }
},
"filter": {
    "filter_shingle":{
       "type":"shingle",
       "max_shingle_size":5,
       "min_shingle_size":2,
       "output_unigrams":"true"
    },
    "custom_delimiter": {
        "type": "word_delimiter",
        "preserve_original": True
    }
}

我正在执行以下搜索:

{
    "query": {
        "bool": {
            "must": [
                {
                    "simple_query_string": {
                        "analyzer": "shingle_analyzer",
                        "fields": [
                            "text_2"
                        ],
                        "lenient": "false",
                        "default_operator": "and",
                        "query": "porsches small red"
                    }
                }
            ]
        }
    }
}

现在,我有一个带有 text_2 = 的文档small red porsches。由于我使用的是 AND 运算符,我希望我的文档不匹配,因为上面的查询应该产生一个“porsches small red”的瓦片,这是一个不同的顺序。但是,当我查看匹配说明时,我只看到单个单词标记“red”“small”“porsche”,当然匹配。

SQS 与带状疱疹不兼容吗?

4

1 回答 1

2

答案是“是的,但是……”。

您所看到的是正常的,因为该text_2字段可能在您的映射中具有标准索引分析器(根据您所看到的解释),即已生成和索引的唯一标记small red porschessmall,redporsches.

在查询方面,您可能正在使用output_unigrams设置为 true(默认)的 shingle 分析器,这意味着除了二元组之外,还将生成一元组标记(再次根据您所看到的解释)。这些 un​​igram 是您获得匹配项的唯一原因。如果您想在二元组上进行匹配,那么一种解决方案是在索引时也使用 shingle 分析器,以便除了一元组small red和之外,red porsches还可以生成和索引二元组和。smallredporsches

然后在查询时,unigrams 也会匹配,但 bigrams 肯定也会匹配small red。为了只匹配二元组,您可以为查询时间设置另一个 shingle 分析器,将其output_unigrams设置为 false,以便仅从您的搜索输入中生成二元组。如果您的查询仅包含一个单词(例如porsches),那么该 shingle 分析器将仅生成一个 unigram(因为output_unigrams_if_no_shingles是真的)并且查询仍将匹配您的文档。如果不需要,您可以简单output_unigrams_if_no_shinglesfalse在您的 shingle 搜索分析器中设置为。

于 2015-12-18T08:46:28.370 回答