使用Elasticsearch进行简单的AND查询

时间:2013-03-18 12:32:26

标签: elasticsearch

我正在尝试对两个指定字段进行简单查询,并且手册和谷歌证明没什么帮助。下面的例子应该很清楚我想要做什么。

{
  "query": {
      "and": {
        "term": {
          "name.family_name": "daniel",
          "name.given_name": "tyrone"
        }
      }
   }
}

作为一个额外的问题,为什么它会找到“Daniel Tyrone”和“daniel”,但是如果我搜索“Daniel”则不会。它的行为就像一个非常奇怪的反案例敏感搜索。

4 个答案:

答案 0 :(得分:10)

编辑:已更新,抱歉。在Bool查询中,每个字段都需要一个单独的Term对象:

{
  "query": {
    "bool": {
        "must" : [
          {
           "term": {
             "name.family_name": "daniel"
           }
         },
         {
           "term": {
             "name.given_name": "tyrone"
           }
         }
       ]
     }
   }
}

ElasticSearch不会分析术语查询,这会使它们区分大小写。术语查询说ES“在索引中查找此精确令牌,包括案例和标点”。

如果您想要不区分大小写,可以在分析器中添加关键字+小写过滤器。或者,您可以使用在查询时分析文本的查询(如Match查询)

Edit2:您也可以使用And或Bool过滤器。

答案 1 :(得分:2)

我在同一领域找到了至少多个文本比较的解决方案:

{
  "query": {
    "match": {
      "name.given_name": {
        "query": "daniel tyrone",
        "operator": "and"
      }
    }
  }

我在多个领域找到了这个,这是正确的方法吗?

{
  "query": {
    "bool": {
      "must": [        
        {
          "match": {
            "name.formatted": {
              "query": "daniel tyrone",
              "operator": "and"
            }
          }
        },
        {
          "match": {
            "display_name": "tyrone"
          }
        }
      ]
    }
  }
}

答案 2 :(得分:0)

如果用PHP编写json,这两个例子对我有用。

$ activeFilters只是一个逗号分隔的字符串,如:'attractions,limpopo'

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class game extends JFrame {

    /**
     *
     */
    private static final long serialVersionUID = 1L;

    public game() {
        nonMaingame canvas = new nonMaingame();
        setSize(1020, 720);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(canvas);

    }

    public static void main(String[] args) {
        new game().setVisible(true);

    }

    public class nonMaingame extends JPanel implements ActionListener {

        /**
         *
         */
        private static final long serialVersionUID = 1L;
        JLabel text;

        public nonMaingame() {
            setLayout(new BorderLayout());

            JPanel canvasSouth = makePanel(Color.RED);
            add(canvasSouth, BorderLayout.SOUTH);

            JPanel canvasNorth = makePanel(Color.BLUE);
            add(canvasNorth, BorderLayout.NORTH);

            JPanel canvasEast = makePanel(Color.YELLOW);
            canvasEast.setBackground(Color.YELLOW);
            add(canvasEast, BorderLayout.EAST);

            JPanel canvasWest = makePanel(Color.MAGENTA);
            add(canvasWest, BorderLayout.WEST);

            text = new JLabel("hey");
            canvasSouth.add(text);
        }

        protected JPanel makePanel(Color color) {
            JPanel pane = new JPanel() {
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(100, 100);
                }
            };
            pane.setBackground(color);
            return pane;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub

        }

    }

}

答案 3 :(得分:0)

这对我有用:minimum_should_match 设置为 2,因为 AND 查询的参数数量为 2

{
"query": {
    "bool": {
        "should": [
                {"term": { "name.family_name": "daniel"}},
                {"term": { "name.given_name": "tyrone" }}
            ],
    "minimum_should_match" : 2

        }
    }
}