V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
dbfox
V2EX  ›  问与答

ElasticSearch 如何精准搜索数组?精确搜索多值字段

  •  
  •   dbfox · 2016-06-24 23:17:56 +08:00 · 17267 次点击
    这是一个创建于 3078 天前的主题,其中的信息可能已经有所发展或是发生改变。

    数据格式如下,要求精确的搜索出 tags:"文字" 的记录 :

    	{
    		"_index" : "xxx",
    		"_type" : "xxx",
    		"_id" : "123",
    		"_version" : 1,
    		"_score" : 1,
    		"_source" : {
    			"iD" : 123,
    			"name" : "xxx",
    			"tags" : [
    				"文字",
    				"恋爱",
    				"冒险"
    			],
    			"keywords" : []
    		}
    	}
    

    我在搜索的时候 tags:"文字" 的时候,会把下面的数据也检索出来,怎么精准的只搜索出 上面这个记录呢?

    	{
    		"_index" : "xxx",
    		"_type" : "xxx",
    		"_id" : "124",
    		"_version" : 1,
    		"_score" : 1,
    		"_source" : {
    			"iD" : 123,
    			"name" : "xxx",
    			"tags" : [
    				"A 文字 A",
    				"恋爱",
    				"冒险"
    			],
    			"keywords" : []
    		}
    	}
    
    12 条回复    2016-06-27 12:06:56 +08:00
    slixurd
        1
    slixurd  
       2016-06-24 23:24:35 +08:00   ❤️ 1
    用 term 搜索。另外 mappings 需要把 index 改成 not_analyzed 。因为默认是 standard analyzer ,所以 stop words 就被隔开了。
    dbfox
        2
    dbfox  
    OP
       2016-06-25 13:16:36 +08:00
    @slixurd 晚上研究研究,这个 mappings 我设置了 not_analyzed 用的 C# 的 NEST 客户端,文档太少,真心难啊
    WinterWu
        3
    WinterWu  
       2016-06-25 14:40:38 +08:00 via iPhone
    es 文档已经很全了,但是功能确实复杂。
    dbfox
        4
    dbfox  
    OP
       2016-06-25 17:15:23 +08:00
    @slixurd 通过我的努力,最终我还是失败了
    还是会查询出来

    比如 我查询 tags:"红包"

    会把 tags:["抢红包","摇红包"] 这些搜索出来,不够精确,不知道为什么,也不知道从哪里下手
    slixurd
        5
    slixurd  
       2016-06-25 19:06:32 +08:00
    @dbfox 用 HTTP 先测试成功再用其他客户端就好了。
    不过说白了,即使是 TCP Client ,最终的查询语句也是完全一样的。
    slixurd
        6
    slixurd  
       2016-06-25 19:20:10 +08:00   ❤️ 1
    dbfox
        7
    dbfox  
    OP
       2016-06-26 10:44:16 +08:00
    @slixurd 表示连接打不开 :-( ,感谢热情回复,晚上我再看看
    dbfox
        8
    dbfox  
    OP
       2016-06-26 10:48:19 +08:00
    @slixurd

    192.30.252.141 gist.github.com
    绑定了 hosts 打开了
    dbfox
        9
    dbfox  
    OP
       2016-06-26 10:53:42 +08:00
    @slixurd

    我用的 C# 客户端,重建了索引,依然不行,我测试下你的例子
    [String(Index = FieldIndexOption.NotAnalyzed)]


    using Nest;
    using System;

    namespace Common.ElasticSearch.Entities
    {
    [ElasticsearchType(IdProperty = "ID")]
    public class TopicEntity
    {
    public int ID { get; set; }

    [String(Index = FieldIndexOption.NotAnalyzed)]
    public string Key { get; set; }

    [String(Index = FieldIndexOption.NotAnalyzed)]
    public string Name { get; set; }

    [String(Index = FieldIndexOption.NotAnalyzed)]
    public string[] Tags { get; set; }

    /// <summary>
    /// 关键字
    /// </summary>
    public string[] Keywords { get; set; }


    /// <summary>
    /// 热度
    /// </summary>
    public int Hot { get; set; }
    }
    }
    dbfox
        10
    dbfox  
    OP
       2016-06-26 10:57:31 +08:00
    @slixurd 测试了下你给的例子,是可行,我得仔细研究下 C# 的客户端 API
    slixurd
        11
    slixurd  
       2016-06-26 11:12:57 +08:00   ❤️ 1
    C#我就不懂了,我是 Java 党。你加油。
    dbfox
        12
    dbfox  
    OP
       2016-06-27 12:06:56 +08:00
    @slixurd 解决了,感谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1127 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:04 · PVG 03:04 · LAX 11:04 · JFK 14:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.