【问题标题】:Retrieve results from SOLR using jquery calls使用 jquery 调用从 SOLR 检索结果
【发布时间】:2013-05-24 19:49:53
【问题描述】:

我正在努力使用 jquery 从 SOLR 获得响应。当我使用下面的代码时,我收到错误消息 Typeerror:data is null

在 firebug 中查看代码时,on_data 函数 中的数据为空。我想我在 Solr URL 中遗漏了一些东西。我使用的 URL 是 http://xxxx.xxx.xxxx.xxx/xxx_xxx/core0/selectcore0/select/?q=%3A&version=2.2&start=0&rows=10&indent=on&wt=json。 能否请您看一下我的代码,并建议我代码中的 URL 样式

<html>
<head>
    <title>Solr Search</title>
</head>
<body>
    <h3>Solr Search</h3>

    Query: <input id="query" /> 
    <button id="search">Search</button>
    <hr/>
    <div id="results">
    </div>
</body>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script>
    function on_data(data) {
        $('#results').empty();

        var docs = data.response.docs;
        $.each(docs, function(i, item) {
            $('#results').prepend($('<div>' + item.name + '</div>'));
        });

        var total = 'Found ' + docs.length + ' results';
        $('#results').prepend('<div>' + total + '</div>');
    }

    function on_search() {
        var query = $('#query').val();
        if (query.length == 0) {
            return;
        }

        var url='http://xxxx.xxx.xxxx.xxx/xxx_xxx/core0/selectcore0/select/?q='+query+'&version=2.2&start=0&rows=50&indent=on&wt=json';
        $.getJSON(url, on_data);
    }

    function on_ready() {
        $('#search').click(on_search);
        /* Hook enter to search */
        $('body').keypress(function(e) {
            if (e.keyCode == '13') {
                on_search();
            }
        });
    }

    $(document).ready(on_ready);
</script>

【问题讨论】:

    标签: javascript jquery solr


    【解决方案1】:

    这是您的代码的工作版本和更改列表: 1) 添加 wrf: 在 JSON 响应周围添加一个包装函数,在 AJAX 中非常有用,带有用于指定 JavaScript 回调函数的动态脚本标签 2) 增加回调:由于 JavaScript 的跨域安全限制,需要使用 JSONP 而不是普通的 JSON 请求。

    <html>
    <head>
        <title>Solr Search</title>
    </head>
    <body>
        <h3>Solr Search</h3>
    
        Query: <input id="query" /> 
        <button id="search">Search</button>
        <hr/>
        <div id="results">
        </div>
    </body>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script>
        function on_data(data) {
            $('#results').empty();
            var docs = data.response.docs;
            $.each(docs, function(i, item) {
                $('#results').prepend($('<div>' + item.name + '</div>'));
            });
    
            var total = 'Found ' + docs.length + ' results';
            $('#results').prepend('<div>' + total + '</div>');
        }
    
        function on_search() {
            var query = $('#query').val();
            if (query.length == 0) {
                return;
            }
    
            var url='http://xxxx.xxx.xxxx.xxx/xxx_xxx/core0/selectcore0/select/?q='+query+'&version=2.2&start=0&rows=50&indent=on&wt=json&callback=?&json.wrf=on_data';
            $.getJSON(url);
        }
    
        function on_ready() {
            $('#search').click(on_search);
            /* Hook enter to search */
            $('body').keypress(function(e) {
                if (e.keyCode == '13') {
                    on_search();
                }
            });
        }
    
        $(document).ready(on_ready);
    </script>
    

    【讨论】:

    • 非常感谢 Chitkara。代码运行没有任何错误,但结果显示为未定义。
    • 在第 20 行,我们正在打印 item.name,这意味着 name 应该是 Solr 索引中的一个字段,这可能不是真的。我建议将其更改为 item.id,并查看它是否打印所有结果的 ID。
    【解决方案2】:

    由于您使用的是 $.getJSON,您可能需要将 &wt=json 添加到您的查询中。

    所以您的查询应该是:http://xxxx.xxx.xxxx.xxx/xxx_xxx/core0/selectcore0/select/?q=search_query&version=2.2&start=0&rows=10&indent=on&wt=json

    默认情况下,Solr 提供 XML 响应。您需要通过添加 &wt=json

    来指定是否需要 JSON 响应

    模式详情:http://wiki.apache.org/solr/SolJSON

    【讨论】:

    • ChitKara 感谢您的回答。即使在使用 json 输出后我也遇到了同样的错误。你能再看看这个问题吗
    • 您的搜索查询是什么?我在您上面的问题中看到,您正在执行 q=%3A,我认为这是不正确的。如果要提取所有结果,则应为:q=%2A%3A%2A 或 q=*:*
    • 我使用的搜索查询是 q=*:*
    【解决方案3】:

    我已经安装了 solr 5.2.1:on_data 函数中的 item.name 不再提供。我使用了 item.id 并且成功了。

    【讨论】:

      猜你喜欢
      • 2019-06-30
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 2012-12-20
      相关资源
      最近更新 更多