1

我正在尝试使用弹性搜索执行短语匹配。

这是我要完成的工作:

data - 1: {
    "test" {
       "title" : "text1 text2"
    }
}

2: {
    "test" {
       "title" : "text3 text4"
    }
}

3: {
    "test" {
       "title" : "text5"
    }
}


4: {
    "test" {
       "title" : "text6"
    }
} 

搜索词:

如果我查找“text0 text1 text2 text3” - 它应该返回#1(匹配完整字符串)

如果我查找“text6 text5 text4 text3” - 它应该返回#4、#3,但不是#2,因为它的顺序不同。

这是我尝试过的:

  • index_analyzeras 关键字设置search_analyzer为标准
  • 还尝试创建自定义令牌

但是我的解决方案都不允许我从搜索查询中查找与文档中的关键字匹配的子字符串。

如果有人写过类似的查询,您能否提供映射的配置方式以及使用的查询类型。

4

1 回答 1

2

我在这里看到的是:您希望您的搜索匹配从查询发送的任何标记。如果这些标记确实匹配,则它必须与标题完全匹配。

这意味着将您的标题字段索引为关键字将使您获得强制匹配。但是,搜索的标准分析器永远不会匹配标题空间,因为您将拥有 index token{"text1 text2"}和 search token [{"text1},{"text2"}]。您不能使用带有任何草率值的词组匹配,否则您的令牌订单要求将被忽略。

因此,您真正需要的是在索引期间生成关键字标记,但您需要在搜索时生成带状疱疹。您的带状疱疹将保持秩序,如果其中一个匹配,请考虑一下。我会设置为不输出 unigram,但如果没有带状疱疹,则允许使用 unigram。这意味着如果你只有一个词,它会输出那个标记,但是如果它可以将你的搜索词组合成不同数量的瓦状标记,它就不会发出单个单词的标记。

PUT
  { "settings":
    {
        "analysis": {
            "filter": {
                "my_shingle": {
                    "type": "shingle",
                    "max_shingle_size": 50,
                    "output_unigrams": false
                }
            },
            "analyzer": {
                "my_shingler": {
                    "filter": [
                        "lowercase",
                        "asciifolding",
                        "my_shingle"
                    ],
                    "type": "custom",
                    "tokenizer": "whitespace"
                }
            }
        }
    }
}

Then you just want to set your type mapping to use the keyword analyzer for index and the `my_shingler` analyzer for search.

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-shingle-tokenfilter.html

于 2013-10-09T01:39:38.270 回答