2

我正在努力使用 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 =开&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>

4

3 回答 3

4

这是您的代码的工作版本和更改列表: 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>
于 2013-05-29T18:17:07.133 回答
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

于 2013-05-24T20:51:49.250 回答
0

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

于 2015-10-03T20:21:48.857 回答