【发布时间】:2019-08-29 04:57:01
【问题描述】:
更新:
在阅读了 Richa 的解释和推荐的blog post 后,问题似乎已经解决,但我需要更多测试才能确认。
首先,应按照 Richa 的建议更改同义词格式:
["green => khaki,green", "pet => cat,pet"]
然后,我必须在索引映射中指定search_analyzer 和index_analyzer:
"mappings": {
"properties": {
"phone_case": {
"type": "text",
"norms": false,
"index_analyzer": "standard",
"search_analyzer": "lowercaseWhiteSpaceAnalyzer"
}
}
}
在映射中添加这两个属性后,我不需要在查询中使用analyzer。
这些更改似乎使流派扩展在“term”和“match_phrase”查询中都能正常工作。
弹性搜索 7.2
同义词数据:
[ "khaki => khaki,green", "cat => cat,pet"]
索引映射:
{
settings: {
"analysis": {
"char_filter": {
"same_word": {
"type": "mapping",
"mappings": ["-=>", "&=>and"]
},
},
"filter": {
"my_stopwords": {
"type": "stop",
"stopwords": STOPWORD_FILE
},
"my_synonym": {
"type": "synonym",
"synonyms": [ "khaki => khaki,green", "cat => cat,pet"],
"tokenizer": "whitespace"
},
},
"analyzer": {
"lowercaseWhiteSpaceAnalyzer": {
"type": "custom",
"char_filter": ["html_strip", "same_word"],
"tokenizer": "standard",
"filter": [
"lowercase",
"my_stopwords",
"my_synonym",
]
},
}
}
}
}
材料领域:
"phone_case":{"type":"text","norms":false,"analyzer":"lowercaseWhiteSpaceAnalyzer"}
示例文件:
[
{
id: "1",
phone_case: "khaki,brushed and polished",
},
{
id: "2",
phone_case: "green,brushed",
},
{
id: "3",
phone_case: "black,matte"
}
]
“phone_case”字段是一个文本字段。
当我搜索 khaki 时,我想查找只有 khaki 结果的文档,不包括任何包含 green 的结果。另一方面,在搜索 green 时,我想获取带有 green 或 khaki 的文档。这应该是类型扩展应该做的。
术语级别查询适用于此类目的:
{
"sort": [
{
"updated": {
"order": "desc"
}
}
],
"size": 10,
"from": 0,
"query": {
"bool": {
"filter": {
"term": {
"phone_case": "khaki"
}
}
}
}
它设法返回包含 khaki 的文档。
但使用 match_phrase,它会返回带有 khaki 或 green 的文档。这不是我所期望的。我想获取包含 khaki 而不是 green 的文档:
{
"sort": [
{
"updated": {
"order": "desc"
}
}
],
"size": 10,
"from": 0,
"query": {
"match_phrase": {
"phone_case": "khaki"
}
}
}
谁能告诉我 match 查询无法排除包含“green”的结果有什么问题?我希望允许用户按确切顺序查找文本字段,但 match 或 match_phrase 不适用于 Genre Expansion Synonyms。
【问题讨论】:
-
请分享您的索引和示例文档的映射
-
@Richa 你好,我刚刚包含了映射和示例文档。
-
在描述中你有
When I search for "ceramic" I want to find documents with just "ceramic" results. When searching for "ceramic", I want to get documents with either "ceramic" or "cerachrom".。我想,第二次是cerachrom -
@Richa,感谢您指出错误。我只是更改了示例以使其更易于理解和阅读。
标签: node.js elasticsearch