gpt4 book ai didi

elasticsearch - 全文搜索Elasticsearch中的完全match_phrase(带有前导和尾随空格)

转载 作者:行者123 更新时间:2023-12-02 22:20:35 24 4
gpt4 key购买 nike

我是Elasticsearch的新手,这是我的任务。

给定我的索引:

{
"my_index": {
"mappings": {
"_default_": {
"_all": {
"enabled": false
},
"properties": {}
},
"title": {
"_all": {
"enabled": false
},
"properties": {
"foo_id": {
"type": "long"
},
"title": {
"type": "string",
"analyzer": "english"
}
}
}
},
"settings": {
...
}
}
}

和样本记录:
{"foo_id": 777, "title": "Equality"}
{"foo_id": 777, "title": "First Among Equals"}
{"foo_id": 777, "title": "AN EQUAL MUSIC"}

我想搜索必须满足以下条件的记录:
  • 有foo_id == 777
  • 包含不区分大小写的单词“等于”

  • 意思是,我必须只找到第三条记录,其中包含确切的短语“等于”。包含单词“equality”和“equals”的标题不得返回。我想避免诉诸正则表达式。

    我尝试过这样的搜索:
    {
    "query": {
    "bool": {
    "must": [
    {"term": {"account_id": 777}},
    {"match_phrase": {"title": "equal"}}
    ]
    }
    }
    }

    但它会返回所有三个结果。

    另一个问题:鉴于我不在乎结果的相关性,我如何以最有效的方式获得结果?我应该使用 search_type='scan'滚动还是过滤?摘录会很好。谢谢。

    最佳答案

    这是您可以做到的一种方法。如果您取出英语分析仪,则会使用standard analyzer代替,它似乎为您提供了想要的东西。

    curl -XPUT "http://localhost:9200/my_index" -d'
    {
    "settings": {
    "number_of_shards": 2,
    "number_of_replicas": 1
    },
    "mappings": {
    "_default_": {
    "_all": {
    "enabled": false
    },
    "properties": {}
    },
    "title": {
    "_all": {
    "enabled": false
    },
    "properties": {
    "foo_id": {
    "type": "long"
    },
    "title": {
    "type": "string"
    }
    }
    }
    }
    }'

    然后添加文档:
    curl -XPUT "http://localhost:9200/my_index/title/1" -d'
    {"foo_id": 777, "title": "Equality"}'
    curl -XPUT "http://localhost:9200/my_index/title/2" -d'
    {"foo_id": 777, "title": "First Among Equals"}'
    curl -XPUT "http://localhost:9200/my_index/title/3" -d'
    {"foo_id": 777, "title": "AN EQUAL MUSIC"}'

    然后,您可以使用 constant score查询来避免额外的计算(如果您不关心结果的排名),并结合使用 must bool filter获得所需的结果:
    curl -XPOST "http://localhost:9200/my_index/_search" -d'
    {
    "query": {
    "constant_score": {
    "filter": {
    "bool": {
    "must": [
    {"term": {
    "foo_id": 777
    }},
    {"term": {
    "title": "equal"
    }}
    ]
    }
    }
    }
    }
    }'

    产生:
    {
    "took": 1,
    "timed_out": false,
    "_shards": {
    "total": 2,
    "successful": 2,
    "failed": 0
    },
    "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
    {
    "_index": "my_index",
    "_type": "title",
    "_id": "3",
    "_score": 1,
    "_source": {
    "foo_id": 777,
    "title": "AN EQUAL MUSIC"
    }
    }
    ]
    }
    }

    这是我使用的代码:

    http://sense.qbox.io/gist/179d737edf1de964090746a2fdae5ad52c935b31

    编辑:如果您希望既可以使用英语分析器又可以使用标准分析器(或其他某些分析器,或者不使用,通常是分面或排序),则可以使用 multi_field(不赞成使用的名称)作为如下:
    curl -XPUT "http://localhost:9200/my_index" -d'
    {
    "settings": {
    "number_of_shards": 2,
    "number_of_replicas": 1
    },
    "mappings": {
    "_default_": {
    "_all": {
    "enabled": false
    },
    "properties": {}
    },
    "title": {
    "_all": {
    "enabled": false
    },
    "properties": {
    "foo_id": {
    "type": "long"
    },
    "title": {
    "type": "string",
    "analyzer": "english",
    "fields": {
    "unstemmed": {
    "type": "string",
    "analyzer": "standard"
    }
    }
    }
    }
    }
    }
    }'

    现在,如果您使用 { "term": { "title": "equal" } }搜索,您将获得全部三个文档,但是如果您使用 { "term": { "title.unstemmed": "equal" } },您将获得所需的内容:
    curl -XPOST "http://localhost:9200/my_index/_search" -d'
    {
    "query": {
    "constant_score": {
    "filter": {
    "bool": {
    "must": [
    {
    "term": {
    "foo_id": 777
    }
    },
    {
    "term": {
    "title.unstemmed": "equal"
    }
    }
    ]
    }
    }
    }
    }
    }'
    ...
    {
    "took": 2,
    "timed_out": false,
    "_shards": {
    "total": 2,
    "successful": 2,
    "failed": 0
    },
    "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
    {
    "_index": "my_index",
    "_type": "title",
    "_id": "3",
    "_score": 1,
    "_source": {
    "foo_id": 777,
    "title": "AN EQUAL MUSIC"
    }
    }
    ]
    }
    }

    这是代码:

    http://sense.qbox.io/gist/40a145e94fd8e47b875525c7e095024f025dd1ab

    关于elasticsearch - 全文搜索Elasticsearch中的完全match_phrase(带有前导和尾随空格),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27640644/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com