ES 新人请教大佬精确查询的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
colinxt
V2EX    Elasticsearch

ES 新人请教大佬精确查询的问题

  •  
  •   colinxt 2024-06-09 13:50:58 +08:00 3665 次点击
    这是一个创建于 487 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人是 ES 新人,目前被安排一个项目有 ES 的,大概背景如下:

    SaaS 项目,没有分库,ES 存储文章内容,并发不高没做分布式。ES 由前人设计,7.9 版本,一个索引存了所有数据,包括文章正文、标题、作者、摘要等等。正文采用 text 类型。整个索引用了 ik 分词并设置为 ik_max_word ,正文字段的搜索分词用 ik smart ,并设置了 fielddata 。

    现在有租户提需求,希望通过关键词查询正文,并且要求结果里一定要出现完整的关键词。听上去很普通的需求?但是有问题啊啊,用 term 一直都会返回一些,不多,但完全没有搜索关键词的结果。

    一开始以为是保留词的问题,所以把用户关心的几个关键词全加到保留词列表里( ik/config 下面,并配置好,重启,重建索引),但结果还是一样。也试过用 .keyword ,查询结果数量更少了。。

    查了网上很多资料,看上去很简单的问题。有没有大佬给指个路?

    感恩感恩。

    7 条回复    2024-06-19 17:03:27 +08:00
    riverdd
        1
    riverdd  
       2024-06-09 14:13:10 +08:00
    ```
    "query": {
    "bool": {
    "should": [
    {"match": {"entry": { "query": req.kw, "minimum_should_match": "-25%"}}},
    {"match_phrase": {"entry": { "query": req.kw, "slop": 5, "boost": 100}}}
    ],
    },
    },
    ```

    试试这样?很久以前写的 query ,我都不记得这些参数啥意思了。
    rqrq
        2
    rqrq  
       2024-06-09 21:51:59 +08:00
    把关键词加到 analysis-ik 目录里的 main.dic ,放到最前面。
    查询例子
    {"size":20,"from":0,"_source":["_id"],"highlight":{"require_field_match":false,"fields":{"title":{},"tags":{},"category":{}}},"query":{"bool":{"must":[{"range":{"status":{"gt":0}}},{"bool":{"should":[{"multi_match":{"query":"关键词","boost":10,"fields":["title^2","tags","category"]}}]}}]}}}
    lix7
        3
    lix7  
       2024-06-10 17:35:22 +08:00
    不考虑停用词的话,match_phrase
    考虑停用词的话,可以加一个 property ,直接单字切分,然后在这个属性上做 match_phrase
    colinxt
        4
    colinxt  
    OP
       2024-06-11 12:40:04 +08:00
    谢谢各位大佬。

    我先试试 match_phrase 。

    @rqrq 想问下,你的意思是说,es 用 dic 文件做分词是有顺序的?即放在前面的先分词?比如,“中国现代化”放前面,那么先分了这个词,如果 dic 后面有“中国”就不会分了?


    @lix7 请教一下,单字切分的意思是给查询字段的每个字都分出来?这样不是跟 ik 分词矛盾了?
    lix7
        5
    lix7  
       2024-06-11 18:55:54 +08:00
    @colinxt #4 一个 property 可以有多个 field ,字段默认作为 ik field ,再加一个 field 配不同的分词器用于单字分词就行,一般看情况还可以加精准匹配 keyword 、拼音、前后缀啥的。
    查询的时候可以用 name.ik ,name.ngram ,name.keyword, name.prefix, name.suffix, name.pinyin
    colinxt
        6
    colinxt  
    OP
       2024-06-11 19:37:45 +08:00
    @lix7 明白了,就是说这个 property 里的 field 相当于这个字段的不同视图,每个视图可以配置不同的分词器等配置属性,但内容上都是这个字段。
    谢谢大佬!
    HetFrame
        7
    HetFrame  
       2024-06-19 17:03:27 +08:00
    先看看你的 es 构建版本 flavor 是不是 default ,如果是,可以用 wildcard 字段,这个字段专门用于"*关键词*"这样的模糊搜索,比直接在 keyword 类型字段上快很多。构建方法可以像 5 楼说的那样建立多字段类型,查询的话就 {"query":{"wildcard":{"content.wildcard":"*中国现代化化*"}}}
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     873 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 20:28 PVG 04:28 LAX 13:28 JFK 16:28
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86