【发布时间】:2015-11-11 11:52:13
【问题描述】:
我想要查询像“jan do”这样的查询,并让它匹配像“jane doe”、“don janek”这样的值——当然还有:“jan do”、“do jan”。
所以我目前能想到的规则是:
- 根据非字母数字值(例如空格、符号、标点符号)对查询进行标记
- 每个查询标记都充当数据存储中匹配标记的前缀
- 标记出现的顺序无关紧要。最好选择“jan do”而不是“do jan”
到目前为止,我有这个映射
PUT /test
{
"settings": {
"analysis": {
"analyzer": {
"my_keyword": {
"type": "custom",
"tokenizer": "keyword",
"filter": [
"asciifolding",
"lowercase"
]
}
}
}
},
"mappings": {
"question": {
"properties": {
"title": {
"type": "string"
},
"answer": {
"type": "object",
"properties": {
"text": {
"type": "string",
"analyzer": "my_keyword",
"fields": {
"stemmed": {
"type": "string",
"analyzer": "standard"
}
}
}
}
}
}
}
}
}
我一直在搜索词组:
POST /test/_search
{
"query": {
"dis_max": {
"tie_breaker": 0.7,
"boost": 1.2,
"queries": [
{
"match": {
"answer.text": {
"query": "jan do",
"type": "phrase_prefix"
}
}
},
{
"match": {
"answer.text.stemmed": {
"query": "jan do",
"operator": "and"
}
}
}
]
}
}
}
当事情真正开始那个短语时,这很好用,但现在我想对查询进行标记并将每个标记视为前缀。
有没有办法可以做到这一点(可能在查询时)?
我的另一个选择是像这样构造一个查询:
POST test/_search
{
"query": {
"bool": {
"should": [
{
"prefix": {
"answer.text.stemmed": "jan"
}
},
{
"prefix": {
"answer.text.stemmed": "do"
}
}
]
}
}
}
这似乎有效,但它不保留单词的顺序。另外,我觉得那是作弊,可能不是最有效的选择。如果有 10 个前缀呢? 100?我想知道是否有人有不同的感觉。
【问题讨论】:
-
@keety 这对我没有帮助。我显然是一个新手,需要的不仅仅是指向稀疏文档页面的链接。不过还是谢谢。
标签: elasticsearch