CrossRef search with query optimization.
(self, query: str, limit: int = 15)
| 1397 | return None |
| 1398 | |
| 1399 | def _search_crossref(self, query: str, limit: int = 15) -> List[Dict]: |
| 1400 | """CrossRef search with query optimization.""" |
| 1401 | try: |
| 1402 | # Optimize query parameters |
| 1403 | params = { |
| 1404 | 'query': query, |
| 1405 | 'query.bibliographic': query, |
| 1406 | 'query.title': query, |
| 1407 | 'rows': limit, |
| 1408 | 'sort': 'relevance', |
| 1409 | 'mailto': 'onecite@users.noreply.github.com' |
| 1410 | } |
| 1411 | |
| 1412 | # Try multiple query strategies |
| 1413 | search_strategies = [ |
| 1414 | params, |
| 1415 | {**params, 'query.author': query.split('.')[0] if '.' in query else query}, |
| 1416 | {**params, 'filter': 'type:journal-article,proceedings-article,book-chapter,book,monograph'}, |
| 1417 | ] |
| 1418 | |
| 1419 | all_results = [] |
| 1420 | seen_dois = set() |
| 1421 | |
| 1422 | for i, strategy_params in enumerate(search_strategies): |
| 1423 | try: |
| 1424 | self.logger.debug(f"CrossRef search strategy {i+1}") |
| 1425 | url = f"{self.crossref_base_url}" |
| 1426 | response = requests.get(url, params=strategy_params, timeout=15) |
| 1427 | response.raise_for_status() |
| 1428 | data = response.json() |
| 1429 | |
| 1430 | for item in data.get('message', {}).get('items', []): |
| 1431 | doi = item.get('DOI') |
| 1432 | if not doi or doi in seen_dois: |
| 1433 | continue |
| 1434 | |
| 1435 | # More complete data extraction |
| 1436 | result = { |
| 1437 | 'source': 'crossref', |
| 1438 | 'doi': doi, |
| 1439 | 'title': item.get('title', [''])[0] if item.get('title') else '', |
| 1440 | 'authors': [], |
| 1441 | 'year': None, |
| 1442 | 'journal': '', |
| 1443 | 'citations': item.get('is-referenced-by-count', 0), |
| 1444 | 'type': item.get('type', ''), |
| 1445 | 'url': f"https://doi.org/{doi}", |
| 1446 | 'publisher': item.get('publisher', ''), |
| 1447 | 'volume': item.get('volume', ''), |
| 1448 | 'issue': item.get('issue', ''), |
| 1449 | 'pages': item.get('page', ''), |
| 1450 | 'isbn': None, |
| 1451 | 'edition': item.get('edition-number', '') |
| 1452 | } |
| 1453 | |
| 1454 | # Handle ISBN (book-specific) |
| 1455 | if item.get('ISBN'): |
| 1456 | isbns = item.get('ISBN', []) |