问题描述
doc1: "blue water"
doc2: "extra blue water"
doc3: "blue waters"
我正在寻找一种方法来处理以下情况
如果用户搜索“blue water”,我希望他收到 doc1 和 doc3(这意味着它会忽略 doc2,并且还会有一个分析器,可以像 doc3 一样提取标记)。
例如,如果我使用 query_string,我将收到 doc2 以及 doc1 和 doc3。
解决方法
您可以将 stemmer 与 percolate query 一起使用
添加一个包含索引数据、映射、搜索查询和搜索结果的工作示例
索引映射:
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "whitespace","filter": [
"stemmer"
]
}
}
}
},"mappings": {
"properties": {
"tags": {
"type": "text","analyzer": "my_analyzer"
},"query": {
"type": "percolator"
}
}
}
}
索引数据:
{
"query": {
"match_phrase": {
"tags": {
"query": "blue waters","analyzer": "my_analyzer"
}
}
}
}
{
"query": {
"match_phrase": {
"tags": {
"query": "extra blue water","analyzer": "my_analyzer"
}
}
}
}
{
"query": {
"match_phrase": {
"tags": {
"query": "blue water","analyzer": "my_analyzer"
}
}
}
}
搜索查询:
{
"query": {
"percolate": {
"field": "query","document": {
"tags": "blue water"
}
}
}
}
搜索结果:
"hits": [
{
"_index": "67671916","_type": "_doc","_id": "3","_score": 0.26152915,"_source": {
"query": {
"match_phrase": {
"tags": {
"query": "blue waters","analyzer": "my_analyzer"
}
}
}
},"fields": {
"_percolator_document_slot": [
0
]
}
},{
"_index": "67671916","_id": "1","_source": {
"query": {
"match_phrase": {
"tags": {
"query": "blue water","fields": {
"_percolator_document_slot": [
0
]
}
}
]
,
在这种情况下,您可以使用前缀搜索。如果您查找 blue water
,则根据前缀搜索,它将给出 doc1 和 doc3。
对于前缀搜索:
{
"query": {
"prefix":{
"doc": word
}
}
}
这里的词 = 蓝水
你可以看看this link。